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// RUN: %clang_cc1 %s -emit-llvm -o %t-opt.ll -triple=x86_64-apple-darwin10 -O3
59b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall// RUN: FileCheck --check-prefix=CHECK-O3 %s < %t-opt.ll
69b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall
745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonstruct A { int a; int b; };
89b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct B { int b; };
99b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct C : B, A { };
109b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
1163b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson// Zero init.
1263b071f28ea936772634c176a34de2bf0301f79cAnders Carlssonnamespace ZeroInit {
139b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit1aE = global i64 -1
1463b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* a;
1563b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
169b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit2aaE = global [2 x i64] [i64 -1, i64 -1]
1763b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aa[2];
1863b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
199b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit3aaaE = global [2 x [2 x i64]] {{\[}}[2 x i64] [i64 -1, i64 -1], [2 x i64] [i64 -1, i64 -1]]
2063b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aaa[2][2];
2163b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
229b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit1bE = global i64 -1,
2363b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* b = 0;
242c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
25cd87d1e4d1b0097877b0f9c2065900717d2aacbaChris Lattner  // CHECK-GLOBAL: @_ZN8ZeroInit2saE = internal global %struct.anon { i64 -1 }
262c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
272c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*a;
282c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } sa;
291fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_sa() { (void) sa; } // force emission
302c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
319b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN8ZeroInit3ssaE = internal
329b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: [2 x i64] [i64 -1, i64 -1]
332c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
342c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*aa[2];
352c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ssa[2];
361fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ssa() { (void) ssa; }
372c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
38cd87d1e4d1b0097877b0f9c2065900717d2aacbaChris Lattner  // CHECK-GLOBAL: @_ZN8ZeroInit2ssE = internal global %struct.anon.1 { %struct.anon.2 { i64 -1 } }
392c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
402c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    struct {
412c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson      int A::*pa;
422c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    } s;
432c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ss;
441fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ss() { (void) ss; }
45a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
46a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct A {
47a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int A::*a;
48a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int b;
49a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
50a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
51a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct B {
52a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    A a[10];
53a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    char c;
54a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int B::*b;
55a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
56a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
57a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct C : A, B { int j; };
589cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  // 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 }, align 8
59a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  C c;
6045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
6163b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
6245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// PR5674
6345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace PR5674 {
649b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  // CHECK-GLOBAL: @_ZN6PR56742pbE = global i64 4
6545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  int A::*pb = &A::b;
6663b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson}
6763b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
68fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson// Casts.
69fe40456f0c0060097564cecaf7faada39185463aAnders Carlssonnamespace Casts {
70fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
719b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint A::*pa;
729b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint C::*pc;
739b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
749b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanvoid f() {
750bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK:      store i64 -1, i64* @_ZN5Casts2paE
769b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = 0;
779b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
780bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2paE, align 8
790bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = add nsw i64 [[TMP]], 4
800bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
810bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
820bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2pcE
839b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pc = pa;
849b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
850bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2pcE, align 8
860bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = sub nsw i64 [[TMP]], 4
870bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
880bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
890bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2paE
909b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = static_cast<int A::*>(pc);
919b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman}
92fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
93fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson}
9445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// Comparisons
9645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace Comparisons {
9745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  void f() {
9845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    int A::*a;
9945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
10145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a) { }
10245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
10445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a != 0) { }
10545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 -1, {{.*}}
10745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 != a) { }
10845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 {{.*}}, -1
11045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a == 0) { }
11145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
11245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 -1, {{.*}}
11345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 == a) { }
11445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  }
11545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
1163cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1173cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonnamespace ValueInit {
1183cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1193cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonstruct A {
1203cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  int A::*a;
1213cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1223cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  char c;
1233cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1243cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  A();
1253cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson};
1263cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
12793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @_ZN9ValueInit1AC2Ev(%"struct.ValueInit::A"* %this) unnamed_addr
1283cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: store i64 -1, i64*
1293cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: ret void
1303cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders CarlssonA::A() : a() {}
1313cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1323cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson}
133a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
1341884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonnamespace PR7139 {
1351884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1361884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct pair {
1371884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int first;
1381884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int second;
1391884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1401884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1411884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssontypedef int pair::*ptr_to_member_type;
1421884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1431884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct ptr_to_member_struct {
1441884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  ptr_to_member_type data;
1451884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int i;
1461884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1471884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1481884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct A {
1491884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  ptr_to_member_struct a;
1501884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1511884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  A() : a() {}
1521884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1531884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
154be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK-O3: define zeroext i1 @_ZN6PR71395checkEv() [[NUW:#[0-9]+]]
1551884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonbool check() {
1561884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  // CHECK-O3: ret i1 true
1571884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  return A().a.data == 0;
1581884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson}
1591884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
160be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK-O3: define zeroext i1 @_ZN6PR71396check2Ev() [[NUW]]
161a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlssonbool check2() {
162a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  // CHECK-O3: ret i1 true
163a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  return ptr_to_member_type() == 0;
164a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson}
165a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson
1661884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson}
1670a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1680a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonnamespace VirtualBases {
1690a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1700a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct A {
1710a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  char c;
1720a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  int A::*i;
1730a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson};
1740a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
175eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson// CHECK-GLOBAL: @_ZN12VirtualBases1bE = global %"struct.VirtualBases::B" { i32 (...)** null, %"struct.VirtualBases::A" { i8 0, i64 -1 } }, align 8
1760a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct B : virtual A { };
1770a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonB b;
1780a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
179eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders Carlsson// CHECK-GLOBAL: @_ZN12VirtualBases1cE = global %"struct.VirtualBases::C" { i32 (...)** null, i64 -1, %"struct.VirtualBases::A" { i8 0, i64 -1 } }, align 8
1800a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct C : virtual A { int A::*i; };
1810a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonC c;
1820a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
183eb9d81dff99d4996f41c93ce71b08aaf753cbae8Anders 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
1840a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct D : C { int A::*i; };
1850a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonD d;
1860a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1870a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson}
188e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
189e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonnamespace Test1 {
190e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
191e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson// Don't crash when A contains a bit-field.
192e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonstruct A {
193e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int A::* a;
194e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int b : 10;
195e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson};
196e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders CarlssonA a;
197e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
198e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson}
199b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
200b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregornamespace BoolPtrToMember {
201b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  struct X {
202b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    bool member;
203b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  };
204b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
205ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // CHECK-LABEL: define nonnull i8* @_ZN15BoolPtrToMember1fERNS_1XEMS0_b
206b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  bool &f(X &x, bool X::*member) {
207b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK: {{bitcast.* to i8\*}}
208b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK-NEXT: getelementptr inbounds i8*
209b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK-NEXT: ret i8*
210b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    return x.*member;
211b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  }
212b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor}
21396e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
21496e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonnamespace PR8507 {
21596e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
21696e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonstruct S;
21796e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonvoid f(S* p, double S::*pm) {
21896e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  if (0 < p->*pm) {
21996e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  }
22096e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
22196e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
22296e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
22396e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
2249b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCallnamespace test4 {
2259b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct A             { int A_i; };
2269b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct B : virtual A { int A::*B_p; };
2279b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct C : virtual B { int    *C_p; };
2289b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  struct D :         C { int    *D_p; };
2299b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall
2309cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris 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
2319b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall  D d;
2329b7da1c46d6d2849f9cb51328d7fcddf2c417672John McCall}
23326e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman
23426e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedmannamespace PR11487 {
23526e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  union U
23626e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  {
23726e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman    int U::* mptr;
23826e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman    char x[16];
23926e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  } x;
24026e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman  // CHECK-GLOBAL: @_ZN7PR114871xE = global %"union.PR11487::U" { i64 -1, [8 x i8] zeroinitializer }, align 8
24126e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman
24226e80cdfe8933a7f804e1d05b379d5ad50119db5Eli Friedman}
24332f498a675df990901e6659d610dc740f9423228Eli Friedman
24432f498a675df990901e6659d610dc740f9423228Eli Friedmannamespace PR13097 {
24532f498a675df990901e6659d610dc740f9423228Eli Friedman  struct X { int x; X(const X&); };
24632f498a675df990901e6659d610dc740f9423228Eli Friedman  struct A {
24732f498a675df990901e6659d610dc740f9423228Eli Friedman    int qq;
24832f498a675df990901e6659d610dc740f9423228Eli Friedman      X x;
24932f498a675df990901e6659d610dc740f9423228Eli Friedman  };
25032f498a675df990901e6659d610dc740f9423228Eli Friedman  A f();
25132f498a675df990901e6659d610dc740f9423228Eli Friedman  X g() { return f().*&A::x; }
25293ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define void @_ZN7PR130971gEv
25332f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK: call void @_ZN7PR130971fEv
25432f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK-NOT: memcpy
25532f498a675df990901e6659d610dc740f9423228Eli Friedman  // CHECK: call void @_ZN7PR130971XC1ERKS0_
25632f498a675df990901e6659d610dc740f9423228Eli Friedman}
257f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
258be9e8bfef6ee7f81ea30e9d358101b4f8d560c6bBill Wendling// CHECK-O3: attributes [[NUW]] = { nounwind readnone{{.*}} }
259