142 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fcxx-exceptions | FileCheck %s2// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fcxx-exceptions -fexperimental-new-constant-interpreter | FileCheck %s3 4#ifdef __SIZEOF_INT128__5// CHECK: @PR11705 = global i128 06__int128_t PR11705 = (__int128_t)&PR11705;7#endif8 9int arr[2];10// CHECK: @pastEnd = constant ptr getelementptr (i8, ptr @arr, i64 8)11int &pastEnd = arr[2];12 13// CHECK: @F = constant ptr @arr, align 814int &F = arr[0];15 16struct S {17 int a;18 float c[3];19};20 21// CHECK: @s = global %struct.S zeroinitializer, align 422S s;23// CHECK: @sp = constant ptr getelementptr (i8, ptr @s, i64 16), align 824float &sp = s.c[3];25 26namespace NearlyZeroInit {27 // CHECK: @_ZN14NearlyZeroInit1bE ={{.*}} global{{.*}} { i32, <{ i32, [2147483647 x i32] }> } { i32 1, <{ i32, [2147483647 x i32] }> <{ i32 2, [2147483647 x i32] zeroinitializer }> }{{.*}}28 struct B { int n; int arr[1024 * 1024 * 1024 * 2u]; } b = {1, {2}};29}30 31namespace BaseClassOffsets {32 struct A { int a; };33 struct B { int b; };34 struct C : A, B { int c; };35 36 extern C c;37 // CHECK: @_ZN16BaseClassOffsets1aE = global ptr @_ZN16BaseClassOffsets1cE, align 838 A* a = &c;39 // CHECK: @_ZN16BaseClassOffsets1bE = global ptr getelementptr (i8, ptr @_ZN16BaseClassOffsets1cE, i64 4), align 840 B* b = &c;41}42 43namespace ExprBase {44 struct A { int n; };45 struct B { int n; };46 struct C : A, B {};47 48 extern const int &&t = ((B&&)C{}).n;49 // CHECK: @_ZGRN8ExprBase1tE_ = internal global {{.*}} zeroinitializer,50 // CHECK: @_ZN8ExprBase1tE = constant ptr {{.*}} @_ZGRN8ExprBase1tE_, {{.*}} 851}52 53namespace reinterpretcast {54 const unsigned int n = 1234;55 extern const int &s = reinterpret_cast<const int&>(n);56 // CHECK: @_ZN15reinterpretcastL1nE = internal constant i32 1234, align 457 // CHECK: @_ZN15reinterpretcast1sE = constant ptr @_ZN15reinterpretcastL1nE, align 858 59 void *f1(unsigned long l) {60 return reinterpret_cast<void *>(l);61 }62 // CHECK: define {{.*}} ptr @_ZN15reinterpretcast2f1Em63 // CHECK: inttoptr64}65 66namespace Bitfield {67 struct S { int a : 5; ~S(); };68 // CHECK: alloca69 // CHECK: call {{.*}}memset70 // CHECK: store i32 {{.*}}, ptr @_ZGRN8Bitfield1rE_71 // CHECK: call void @_ZN8Bitfield1SD172 // CHECK: store ptr @_ZGRN8Bitfield1rE_, ptr @_ZN8Bitfield1rE, align 873 int &&r = S().a;74}75 76namespace Null {77 decltype(nullptr) null();78 // CHECK: call {{.*}} @_ZN4Null4nullEv(79 int *p = null();80 struct S {};81 // CHECK: call {{.*}} @_ZN4Null4nullEv(82 int S::*q = null();83}84 85struct A {86 A();87 ~A();88 enum E { Foo };89};90 91A *g();92 93void f(A *a) {94 A::E e1 = a->Foo;95 96 // CHECK: call noundef ptr @_Z1gv()97 A::E e2 = g()->Foo;98 // CHECK: call void @_ZN1AC1Ev(99 // CHECK: call void @_ZN1AD1Ev(100 A::E e3 = A().Foo;101}102 103int notdead() {104 auto l = [c=0]() mutable {105 return c++ < 5 ? 10 : 12;106 };107 return l();108}109// CHECK: _ZZ7notdeadvEN3$_0clEv110// CHECK: ret i32 %cond111 112/// The conmparison of those two parameters should NOT work.113bool paramcmp(const int& lhs, const int& rhs) {114 if (&lhs == &rhs)115 return true;116 return false;117}118// CHECK: _Z8paramcmpRKiS0_119// CHECK: if.then120// CHECK: if.end121 122/// &x == &OuterX should work and return 0.123class X {124public:125 X();126 X(const X&);127 X(const volatile X &);128 ~X();129};130 131extern X OuterX;132 133X test24() {134 X x;135 if (&x == &OuterX)136 throw 0;137 return x;138}139// CHECK: _Z6test24v140// CHECK-NOT: eh.resume141// CHECK-NOT: unreachable142