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