19b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall// RUN: %clang_cc1 %s -emit-llvm -o %t.ll -triple=x86_64-apple-darwin10
29b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall// RUN: FileCheck %s < %t.ll
39b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall// RUN: FileCheck -check-prefix=CHECK-GLOBAL %s < %t.ll
49b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall
545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonstruct A { int a; int b; };
69b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct B { int b; };
79b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct C : B, A { };
89b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
963b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson// Zero init.
1063b071f28ea936772634c176a34de2bf0301f79cAnders Carlssonnamespace ZeroInit {
119b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit1aE = global i64 -1
1263b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* a;
1363b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
149b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit2aaE = global [2 x i64] [i64 -1, i64 -1]
1563b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aa[2];
1663b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
179b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit3aaaE = global [2 x [2 x i64]] {{\[}}[2 x i64] [i64 -1, i64 -1], [2 x i64] [i64 -1, i64 -1]]
1863b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aaa[2][2];
1963b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
209b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit1bE = global i64 -1,
2163b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* b = 0;
222c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
23cd87d1e4d1b0097877b0f9c2065900717d2aacbaChris Lattner  // CHECK-GLOBAL: @_ZN8ZeroInit2saE = internal global %struct.anon { i64 -1 }
242c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
252c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*a;
262c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } sa;
271fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_sa() { (void) sa; } // force emission
282c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
299b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit3ssaE = internal
309b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: [2 x i64] [i64 -1, i64 -1]
312c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
322c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*aa[2];
332c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ssa[2];
341fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ssa() { (void) ssa; }
352c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
36cd87d1e4d1b0097877b0f9c2065900717d2aacbaChris Lattner  // CHECK-GLOBAL: @_ZN8ZeroInit2ssE = internal global %struct.anon.1 { %struct.anon.2 { i64 -1 } }
372c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
382c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    struct {
392c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson      int A::*pa;
402c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    } s;
412c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ss;
421fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ss() { (void) ss; }
43a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
44a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct A {
45a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int A::*a;
46a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int b;
47a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
48a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
49a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct B {
50a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    A a[10];
51a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    char c;
52a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int B::*b;
53a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
54a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
55a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct C : A, B { int j; };
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-GLOBAL: @_ZN8ZeroInit1cE = global {{%.*}} <{ %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::B" { [10 x %"struct.ZeroInit::A"] [%"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }, %"struct.ZeroInit::A" { i64 -1, i32 0 }], i8 0, i64 -1 }, i32 0, [4 x i8] zeroinitializer }>, align 8
57a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  C c;
5845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
5963b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
6045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// PR5674
6145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace PR5674 {
629b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN6PR56742pbE = global i64 4
6345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  int A::*pb = &A::b;
6463b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson}
6563b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
66fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson// Casts.
67fe40456f0c0060097564cecaf7faada39185463aAnders Carlssonnamespace Casts {
68fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
699b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint A::*pa;
709b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint C::*pc;
719b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
729b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanvoid f() {
730bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK:      store i64 -1, i64* @_ZN5Casts2paE
749b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = 0;
759b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
763ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[TMP:%.*]] = load i64, i64* @_ZN5Casts2paE, align 8
770bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = add nsw i64 [[TMP]], 4
780bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
790bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
800bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2pcE
819b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pc = pa;
829b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar  // CHECK-NEXT: [[TMP:%.*]] = load i64, i64* @_ZN5Casts2pcE, align 8
840bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = sub nsw i64 [[TMP]], 4
850bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
860bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
870bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2paE
889b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = static_cast<int A::*>(pc);
899b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman}
90fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
91fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson}
9245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// Comparisons
9445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace Comparisons {
9545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  void f() {
9645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    int A::*a;
9745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
9945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a) { }
10045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
10245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a != 0) { }
10345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 -1, {{.*}}
10545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 != a) { }
10645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 {{.*}}, -1
10845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a == 0) { }
10945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
11045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 -1, {{.*}}
11145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 == a) { }
11245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  }
11345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
1143cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1153cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonnamespace ValueInit {
1163cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1173cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonstruct A {
1183cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  int A::*a;
1193cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1203cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  char c;
1213cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1223cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  A();
1233cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson};
1243cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
12593ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN9ValueInit1AC2Ev(%"struct.ValueInit::A"* %this) unnamed_addr
1263cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: store i64 -1, i64*
1273cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: ret void
1283cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders CarlssonA::A() : a() {}
1293cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1303cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson}
131a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
1320a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonnamespace VirtualBases {
1330a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1340a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct A {
1350a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  char c;
1360a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  int A::*i;
1370a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson};
1380a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
139eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson// CHECK-GLOBAL: @_ZN12VirtualBases1bE = global %"struct.VirtualBases::B" { i32 (...)** null, %"struct.VirtualBases::A" { i8 0, i64 -1 } }, align 8
1400a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct B : virtual A { };
1410a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonB b;
1420a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
143eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson// CHECK-GLOBAL: @_ZN12VirtualBases1cE = global %"struct.VirtualBases::C" { i32 (...)** null, i64 -1, %"struct.VirtualBases::A" { i8 0, i64 -1 } }, align 8
1440a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct C : virtual A { int A::*i; };
1450a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonC c;
1460a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
147eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson// CHECK-GLOBAL: @_ZN12VirtualBases1dE = global %"struct.VirtualBases::D" { %"struct.VirtualBases::C.base" { i32 (...)** null, i64 -1 }, i64 -1, %"struct.VirtualBases::A" { i8 0, i64 -1 } }, align 8
1480a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct D : C { int A::*i; };
1490a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonD d;
1500a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1510a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson}
152e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
153e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonnamespace Test1 {
154e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
155e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson// Don't crash when A contains a bit-field.
156e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonstruct A {
157e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int A::* a;
158e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int b : 10;
159e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson};
160e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders CarlssonA a;
161e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
162e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson}
163b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
164b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregornamespace BoolPtrToMember {
165b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  struct X {
166b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    bool member;
167b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  };
168b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
169176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // CHECK-LABEL: define dereferenceable({{[0-9]+}}) i8* @_ZN15BoolPtrToMember1fERNS_1XEMS0_b
170b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  bool &f(X &x, bool X::*member) {
171b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK: {{bitcast.* to i8\*}}
1723ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar    // CHECK-NEXT: getelementptr inbounds i8, i8*
173b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK-NEXT: ret i8*
174b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    return x.*member;
175b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  }
176b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor}
17796e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
17896e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonnamespace PR8507 {
17996e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
18096e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonstruct S;
18196e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonvoid f(S* p, double S::*pm) {
18296e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  if (0 < p->*pm) {
18396e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  }
18496e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
18596e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
18696e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
18796e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
1889b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCallnamespace test4 {
1899b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct A             { int A_i; };
1909b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct B : virtual A { int A::*B_p; };
1919b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct C : virtual B { int    *C_p; };
1929b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct D :         C { int    *D_p; };
1939b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall
1949cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // CHECK-GLOBAL: @_ZN5test41dE = global %"struct.test4::D" { %"struct.test4::C.base" zeroinitializer, i32* null, %"struct.test4::B.base" { i32 (...)** null, i64 -1 }, %"struct.test4::A" zeroinitializer }, align 8
1959b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  D d;
1969b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall}
19726e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman
19826e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedmannamespace PR11487 {
19926e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  union U
20026e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  {
20126e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman    int U::* mptr;
20226e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman    char x[16];
20326e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  } x;
20426e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  // CHECK-GLOBAL: @_ZN7PR114871xE = global %"union.PR11487::U" { i64 -1, [8 x i8] zeroinitializer }, align 8
20526e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman
20626e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman}
20732f498a675df990901e6659d610dc740f9423228Eli Friedman
20832f498a675df990901e6659d610dc740f9423228Eli Friedmannamespace PR13097 {
20932f498a675df990901e6659d610dc740f9423228Eli Friedman  struct X { int x; X(const X&); };
21032f498a675df990901e6659d610dc740f9423228Eli Friedman  struct A {
21132f498a675df990901e6659d610dc740f9423228Eli Friedman    int qq;
21232f498a675df990901e6659d610dc740f9423228Eli Friedman      X x;
21332f498a675df990901e6659d610dc740f9423228Eli Friedman  };
21432f498a675df990901e6659d610dc740f9423228Eli Friedman  A f();
21532f498a675df990901e6659d610dc740f9423228Eli Friedman  X g() { return f().*&A::x; }
21693ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR130971gEv
21732f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK: call void @_ZN7PR130971fEv
21832f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK-NOT: memcpy
21932f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK: call void @_ZN7PR130971XC1ERKS0_
22032f498a675df990901e6659d610dc740f9423228Eli Friedman}
221f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
222176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR21089 {
223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct A {
224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool : 1;
225176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int A::*x;
226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  bool y;
227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  A();
228176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
229176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct B : A {
230176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesB b;
232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-GLOBAL: @_ZN7PR210891bE = global %"struct.PR21089::B" { %"struct.PR21089::A.base" <{ i8 0, [7 x i8] zeroinitializer, i64 -1, i8 0 }>, [7 x i8] zeroinitializer }, align 8
233176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
235176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR21282 {
236176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesunion U {
237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int U::*x;
238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  long y[2];
239176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesU u;
241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-GLOBAL: @_ZN7PR212821uE = global %"union.PR21282::U" { i64 -1, [8 x i8] zeroinitializer }, align 8
242176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
243176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
244b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace FlexibleArrayMember {
245b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarstruct S {
246b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  int S::*x[];
247b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar};
248b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarS s;
249b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-GLOBAL: @_ZN19FlexibleArrayMember1sE = global %"struct.FlexibleArrayMember::S" zeroinitializer, align 8
250b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
251b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar
252b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarnamespace IndirectPDM {
253b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainarunion U {
254b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  union {
255b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar    int U::*m;
256b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar  };
257b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar};
258b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga NainarU u;
259b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar// CHECK-GLOBAL: @_ZN11IndirectPDM1uE = global %"union.IndirectPDM::U" { %union.anon { i64 -1 } }, align 8
260b6d6993e6e6d3daf4d9876794254d20a134e37c2Pirama Arumuga Nainar}
261