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:
parent
45318c5a0e
commit
a3fa6e22a1
37
test/CodeGeneration/const.C
Normal file
37
test/CodeGeneration/const.C
Normal 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
|
Loading…
Reference in New Issue
Block a user