1a07aba5dSTimm Baeder // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s | FileCheck %s 2a07aba5dSTimm Baeder // RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -o - %s -fexperimental-new-constant-interpreter | FileCheck %s 3a07aba5dSTimm Baeder 4*e637a5c9STimm Baeder #ifdef __SIZEOF_INT128__ 5*e637a5c9STimm Baeder // CHECK: @PR11705 = global i128 0 6*e637a5c9STimm Baeder __int128_t PR11705 = (__int128_t)&PR11705; 7*e637a5c9STimm Baeder #endif 8a07aba5dSTimm Baeder 9a07aba5dSTimm Baeder int arr[2]; 10a07aba5dSTimm Baeder // CHECK: @pastEnd = constant ptr getelementptr (i8, ptr @arr, i64 8) 11a07aba5dSTimm Baeder int &pastEnd = arr[2]; 12a07aba5dSTimm Baeder 13a07aba5dSTimm Baeder // CHECK: @F = constant ptr @arr, align 8 14a07aba5dSTimm Baeder int &F = arr[0]; 15a07aba5dSTimm Baeder 16a07aba5dSTimm Baeder struct S { 17a07aba5dSTimm Baeder int a; 18a07aba5dSTimm Baeder float c[3]; 19a07aba5dSTimm Baeder }; 20a07aba5dSTimm Baeder 21a07aba5dSTimm Baeder // CHECK: @s = global %struct.S zeroinitializer, align 4 22a07aba5dSTimm Baeder S s; 23a07aba5dSTimm Baeder // CHECK: @sp = constant ptr getelementptr (i8, ptr @s, i64 16), align 8 24a07aba5dSTimm Baeder float &sp = s.c[3]; 25a07aba5dSTimm Baeder 26a07aba5dSTimm Baeder 27a07aba5dSTimm Baeder namespace BaseClassOffsets { 28a07aba5dSTimm Baeder struct A { int a; }; 29a07aba5dSTimm Baeder struct B { int b; }; 30a07aba5dSTimm Baeder struct C : A, B { int c; }; 31a07aba5dSTimm Baeder 32a07aba5dSTimm Baeder extern C c; 33a07aba5dSTimm Baeder // CHECK: @_ZN16BaseClassOffsets1aE = global ptr @_ZN16BaseClassOffsets1cE, align 8 34a07aba5dSTimm Baeder A* a = &c; 35a07aba5dSTimm Baeder // CHECK: @_ZN16BaseClassOffsets1bE = global ptr getelementptr (i8, ptr @_ZN16BaseClassOffsets1cE, i64 4), align 8 36a07aba5dSTimm Baeder B* b = &c; 37a07aba5dSTimm Baeder } 38a07aba5dSTimm Baeder 39a07aba5dSTimm Baeder namespace ExprBase { 40a07aba5dSTimm Baeder struct A { int n; }; 41a07aba5dSTimm Baeder struct B { int n; }; 42a07aba5dSTimm Baeder struct C : A, B {}; 43a07aba5dSTimm Baeder 44a07aba5dSTimm Baeder extern const int &&t = ((B&&)C{}).n; 45a07aba5dSTimm Baeder // CHECK: @_ZGRN8ExprBase1tE_ = internal global {{.*}} zeroinitializer, 46a07aba5dSTimm Baeder // CHECK: @_ZN8ExprBase1tE = constant ptr {{.*}} @_ZGRN8ExprBase1tE_, {{.*}} 8 47a07aba5dSTimm Baeder } 48a07aba5dSTimm Baeder 49a07aba5dSTimm Baeder namespace reinterpretcast { 50a07aba5dSTimm Baeder const unsigned int n = 1234; 51a07aba5dSTimm Baeder extern const int &s = reinterpret_cast<const int&>(n); 52a07aba5dSTimm Baeder // CHECK: @_ZN15reinterpretcastL1nE = internal constant i32 1234, align 4 53a07aba5dSTimm Baeder // CHECK: @_ZN15reinterpretcast1sE = constant ptr @_ZN15reinterpretcastL1nE, align 8 54a07aba5dSTimm Baeder 55a07aba5dSTimm Baeder void *f1(unsigned long l) { 56a07aba5dSTimm Baeder return reinterpret_cast<void *>(l); 57a07aba5dSTimm Baeder } 58a07aba5dSTimm Baeder // CHECK: define {{.*}} ptr @_ZN15reinterpretcast2f1Em 59a07aba5dSTimm Baeder // CHECK: inttoptr 60a07aba5dSTimm Baeder } 61a07aba5dSTimm Baeder 62a07aba5dSTimm Baeder namespace Bitfield { 63a07aba5dSTimm Baeder struct S { int a : 5; ~S(); }; 64a07aba5dSTimm Baeder // CHECK: alloca 65a07aba5dSTimm Baeder // CHECK: call {{.*}}memset 66a07aba5dSTimm Baeder // CHECK: store i32 {{.*}}, ptr @_ZGRN8Bitfield1rE_ 67a07aba5dSTimm Baeder // CHECK: call void @_ZN8Bitfield1SD1 68a07aba5dSTimm Baeder // CHECK: store ptr @_ZGRN8Bitfield1rE_, ptr @_ZN8Bitfield1rE, align 8 69a07aba5dSTimm Baeder int &&r = S().a; 70a07aba5dSTimm Baeder } 71d27278a8STimm Baeder 72d27278a8STimm Baeder namespace Null { 73d27278a8STimm Baeder decltype(nullptr) null(); 74d27278a8STimm Baeder // CHECK: call {{.*}} @_ZN4Null4nullEv( 75d27278a8STimm Baeder int *p = null(); 76d27278a8STimm Baeder struct S {}; 77d27278a8STimm Baeder // CHECK: call {{.*}} @_ZN4Null4nullEv( 78d27278a8STimm Baeder int S::*q = null(); 79d27278a8STimm Baeder } 8083fea8b8STimm Baeder 8183fea8b8STimm Baeder struct A { 8283fea8b8STimm Baeder A(); 8383fea8b8STimm Baeder ~A(); 8483fea8b8STimm Baeder enum E { Foo }; 8583fea8b8STimm Baeder }; 8683fea8b8STimm Baeder 8783fea8b8STimm Baeder A *g(); 8883fea8b8STimm Baeder 8983fea8b8STimm Baeder void f(A *a) { 9083fea8b8STimm Baeder A::E e1 = a->Foo; 9183fea8b8STimm Baeder 9283fea8b8STimm Baeder // CHECK: call noundef ptr @_Z1gv() 9383fea8b8STimm Baeder A::E e2 = g()->Foo; 9483fea8b8STimm Baeder // CHECK: call void @_ZN1AC1Ev( 9583fea8b8STimm Baeder // CHECK: call void @_ZN1AD1Ev( 9683fea8b8STimm Baeder A::E e3 = A().Foo; 9783fea8b8STimm Baeder } 98