xref: /aosp_15_r20/external/clang/test/CodeGenCXX/member-expressions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -emit-llvm %s -o - -triple=x86_64-apple-darwin10 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // PR5392
4*67e74705SXin Li namespace PR5392 {
5*67e74705SXin Li struct A
6*67e74705SXin Li {
7*67e74705SXin Li   static int a;
8*67e74705SXin Li };
9*67e74705SXin Li 
10*67e74705SXin Li A a1;
f()11*67e74705SXin Li void f()
12*67e74705SXin Li {
13*67e74705SXin Li   // CHECK: store i32 10, i32* @_ZN6PR53921A1aE
14*67e74705SXin Li   a1.a = 10;
15*67e74705SXin Li   // CHECK: store i32 20, i32* @_ZN6PR53921A1aE
16*67e74705SXin Li   A().a = 20;
17*67e74705SXin Li }
18*67e74705SXin Li 
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li struct A {
22*67e74705SXin Li   A();
23*67e74705SXin Li   ~A();
24*67e74705SXin Li   enum E { Foo };
25*67e74705SXin Li };
26*67e74705SXin Li 
27*67e74705SXin Li A *g();
28*67e74705SXin Li 
f(A * a)29*67e74705SXin Li void f(A *a) {
30*67e74705SXin Li   A::E e1 = a->Foo;
31*67e74705SXin Li 
32*67e74705SXin Li   // CHECK: call %struct.A* @_Z1gv()
33*67e74705SXin Li   A::E e2 = g()->Foo;
34*67e74705SXin Li   // CHECK: call void @_ZN1AC1Ev(
35*67e74705SXin Li   // CHECK: call void @_ZN1AD1Ev(
36*67e74705SXin Li   A::E e3 = A().Foo;
37*67e74705SXin Li }
38*67e74705SXin Li 
39*67e74705SXin Li namespace test3 {
40*67e74705SXin Li struct A {
41*67e74705SXin Li   static int foo();
42*67e74705SXin Li };
f()43*67e74705SXin Li int f() {
44*67e74705SXin Li   return A().foo();
45*67e74705SXin Li }
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li namespace test4 {
49*67e74705SXin Li   struct A {
50*67e74705SXin Li     int x;
51*67e74705SXin Li   };
52*67e74705SXin Li   struct B {
53*67e74705SXin Li     int x;
54*67e74705SXin Li     void foo();
55*67e74705SXin Li   };
56*67e74705SXin Li   struct C : A, B {
57*67e74705SXin Li   };
58*67e74705SXin Li 
59*67e74705SXin Li   extern C *c_ptr;
60*67e74705SXin Li 
61*67e74705SXin Li   // CHECK-LABEL: define i32 @_ZN5test44testEv()
test()62*67e74705SXin Li   int test() {
63*67e74705SXin Li     // CHECK: load {{.*}} @_ZN5test45c_ptrE
64*67e74705SXin Li     // CHECK-NEXT: bitcast
65*67e74705SXin Li     // CHECK-NEXT: getelementptr
66*67e74705SXin Li     // CHECK-NEXT: bitcast
67*67e74705SXin Li     // CHECK-NEXT: call void @_ZN5test41B3fooEv
68*67e74705SXin Li     c_ptr->B::foo();
69*67e74705SXin Li 
70*67e74705SXin Li     // CHECK: load {{.*}} @_ZN5test45c_ptrE
71*67e74705SXin Li     // CHECK-NEXT: bitcast
72*67e74705SXin Li     // CHECK-NEXT: getelementptr
73*67e74705SXin Li     // CHECK-NEXT: bitcast
74*67e74705SXin Li     // CHECK-NEXT: getelementptr
75*67e74705SXin Li     // CHECK-NEXT: store i32 5
76*67e74705SXin Li     c_ptr->B::x = 5;
77*67e74705SXin Li 
78*67e74705SXin Li     // CHECK: load {{.*}} @_ZN5test45c_ptrE
79*67e74705SXin Li     // CHECK-NEXT: bitcast
80*67e74705SXin Li     // CHECK-NEXT: getelementptr
81*67e74705SXin Li     // CHECK-NEXT: bitcast
82*67e74705SXin Li     // CHECK-NEXT: getelementptr
83*67e74705SXin Li     // CHECK-NEXT: load i32, i32*
84*67e74705SXin Li     return c_ptr->B::x;
85*67e74705SXin Li   }
86*67e74705SXin Li }
87