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
This commit is contained in:
Jonas Hahnfeld 2023-10-03 17:03:11 +02:00 committed by jenkins
parent 45318c5a0e
commit a3fa6e22a1

View File

@ -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