From a3fa6e22a1b021885f97f778b33de32319980eaa Mon Sep 17 00:00:00 2001 From: Jonas Hahnfeld Date: Tue, 3 Oct 2023 17:03:11 +0200 Subject: [PATCH] Emit const variables only once (#13614) Otherwise they are emitted as internal and we get double-construction and -destruction on the same memory address due to the way we promote internal declarations in KeepLocalGVPass. According to upstream tests, the de-duplication doesn't work on Windows (yet), but I think this problem is severe enough to fix it on the other platforms sooner rather than later. Fixes #13429 --- test/CodeGeneration/const.C | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 test/CodeGeneration/const.C diff --git a/test/CodeGeneration/const.C b/test/CodeGeneration/const.C new file mode 100644 index 0000000000..8fe1397be3 --- /dev/null +++ b/test/CodeGeneration/const.C @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// CLING - the C++ LLVM-based InterpreterG :) +// +// This file is dual-licensed: you can choose to license it under the University +// of Illinois Open Source License or the GNU Lesser General Public License. See +// LICENSE.TXT for details. +//------------------------------------------------------------------------------ + +// RUN: cat %s | %cling 2>&1 | FileCheck %s + +extern "C" int printf(const char*, ...); + +struct A { + int val; + A(int v) : val(v) { + printf("A(%d), this = %p\n", val, this); + } + ~A() { + printf("~A(%d), this = %p\n", val, this); + } + int getVal() const { return val; } +}; + +const A a(1); +// CHECK: A(1), this = [[PTR:.+]] + +a.val +// CHECK-NEXT: (const int) 1 +a.getVal() +// CHECK-NEXT: (int) 1 +a.val +// CHECK-NEXT: (const int) 1 +a.getVal() +// CHECK-NEXT: (int) 1 + +// CHECK-NEXT: ~A(1), this = [[PTR]] +// CHECK-NOT: ~A