xref: /llvm-project/clang/test/AST/ByteCode/codegen.cpp (revision e637a5c9fef866158018dcaecc3c385d157460f5)
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