pointers-to-data-members.cpp revision 0691a5c83246604a89654e0dfc25870e742035b4
1fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 | FileCheck %s
21884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson// RUN: %clang_cc1 %s -emit-llvm -o - -triple=x86_64-apple-darwin10 -O3 | FileCheck --check-prefix=CHECK-O3 %s
345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonstruct A { int a; int b; };
49b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct B { int b; };
59b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanstruct C : B, A { };
69b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
763b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson// Zero init.
863b071f28ea936772634c176a34de2bf0301f79cAnders Carlssonnamespace ZeroInit {
963b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  // CHECK: @_ZN8ZeroInit1aE = global i64 -1
1063b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* a;
1163b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
1263b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  // CHECK: @_ZN8ZeroInit2aaE = global [2 x i64] [i64 -1, i64 -1]
1363b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aa[2];
1463b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
1563b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  // CHECK: @_ZN8ZeroInit3aaaE = global [2 x [2 x i64]] {{\[}}[2 x i64] [i64 -1, i64 -1], [2 x i64] [i64 -1, i64 -1]]
1663b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* aaa[2][2];
1763b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
1863b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  // CHECK: @_ZN8ZeroInit1bE = global i64 -1,
1963b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson  int A::* b = 0;
202c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
211fb0caaa7bef765b85972274e3b434af2572c141John McCall  // CHECK: @_ZN8ZeroInit2saE = internal global %struct.anon { i64 -1 }
222c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
232c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*a;
242c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } sa;
251fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_sa() { (void) sa; } // force emission
262c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
271fb0caaa7bef765b85972274e3b434af2572c141John McCall  // CHECK: @_ZN8ZeroInit3ssaE = internal
287e673c4c11cd1a26e87f666c37c744e9f0446dd9Anders Carlsson  // CHECK: [2 x i64] [i64 -1, i64 -1]
292c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
302c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    int A::*aa[2];
312c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ssa[2];
321fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ssa() { (void) ssa; }
332c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson
341fb0caaa7bef765b85972274e3b434af2572c141John McCall  // CHECK: @_ZN8ZeroInit2ssE = internal global %1 { %struct.anon { i64 -1 } }
352c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  struct {
362c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    struct {
372c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson      int A::*pa;
382c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson    } s;
392c12d0319a267b844cb7d569d84426cd344b90f7Anders Carlsson  } ss;
401fb0caaa7bef765b85972274e3b434af2572c141John McCall  void test_ss() { (void) ss; }
41a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
42a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct A {
43a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int A::*a;
44a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int b;
45a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
46a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
47a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct B {
48a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    A a[10];
49a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    char c;
50a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson    int B::*b;
51a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  };
52a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
53a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  struct C : A, B { int j; };
54a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  // CHECK: @_ZN8ZeroInit1cE = global %"struct.ZeroInit::C" { [16 x i8] c"\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00", [176 x i8] c"\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\FF\FF\FF\FF\FF\FF\FF\FF", i32 0, [4 x i8] zeroinitializer }
55a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson  C c;
5645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
5763b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
5845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// PR5674
5945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace PR5674 {
6045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  // CHECK: @_ZN6PR56742pbE = global i64 4
6145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  int A::*pb = &A::b;
6263b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson}
6363b071f28ea936772634c176a34de2bf0301f79cAnders Carlsson
64fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson// Casts.
65fe40456f0c0060097564cecaf7faada39185463aAnders Carlssonnamespace Casts {
66fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
679b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint A::*pa;
689b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanint C::*pc;
699b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
709b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedmanvoid f() {
710bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK:      store i64 -1, i64* @_ZN5Casts2paE
729b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = 0;
739b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
740bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2paE, align 8
750bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = add nsw i64 [[TMP]], 4
760bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
770bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
780bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2pcE
799b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pc = pa;
809b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman
810bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[TMP:%.*]] = load i64* @_ZN5Casts2pcE, align 8
820bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ADJ:%.*]] = sub nsw i64 [[TMP]], 4
830bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq i64 [[TMP]], -1
840bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: [[RES:%.*]] = select i1 [[ISNULL]], i64 [[TMP]], i64 [[ADJ]]
850bab0cdab751248ca389a5592bcb70eac5d39260John McCall  // CHECK-NEXT: store i64 [[RES]], i64* @_ZN5Casts2paE
869b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman  pa = static_cast<int A::*>(pc);
879b3727457d1f779da81569c2ca42ff6cd5f5b03dEli Friedman}
88fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson
89fe40456f0c0060097564cecaf7faada39185463aAnders Carlsson}
9045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson// Comparisons
9245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlssonnamespace Comparisons {
9345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  void f() {
9445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    int A::*a;
9545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
9745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a) { }
9845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
9945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 {{.*}}, -1
10045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a != 0) { }
10145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10245147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp ne i64 -1, {{.*}}
10345147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 != a) { }
10445147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10545147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 {{.*}}, -1
10645147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (a == 0) { }
10745147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson
10845147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    // CHECK: icmp eq i64 -1, {{.*}}
10945147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson    if (0 == a) { }
11045147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson  }
11145147d0098a34c3705f74ca121b27d7736ac113aAnders Carlsson}
1123cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1133cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonnamespace ValueInit {
1143cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1153cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlssonstruct A {
1163cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  int A::*a;
1173cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1183cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  char c;
1193cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1203cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson  A();
1213cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson};
1223cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1230691a5c83246604a89654e0dfc25870e742035b4Rafael Espindola// CHECK: define void @_ZN9ValueInit1AC2Ev(%"struct.ValueInit::A"* %this) unnamed_addr
1243cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: store i64 -1, i64*
1253cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson// CHECK: ret void
1263cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders CarlssonA::A() : a() {}
1273cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson
1283cb18bcefe39756f3b079fa1a62b4c9cbf6a592fAnders Carlsson}
129a83fb4bf8119b980ccf7de0795dff250a799ea58Anders Carlsson
1301884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonnamespace PR7139 {
1311884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1321884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct pair {
1331884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int first;
1341884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int second;
1351884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1361884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1371884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssontypedef int pair::*ptr_to_member_type;
1381884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1391884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct ptr_to_member_struct {
1401884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  ptr_to_member_type data;
1411884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  int i;
1421884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1431884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1441884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonstruct A {
1451884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  ptr_to_member_struct a;
1461884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1471884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  A() : a() {}
1481884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson};
1491884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
1501884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson// CHECK-O3: define zeroext i1 @_ZN6PR71395checkEv() nounwind readnone
1511884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlssonbool check() {
1521884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  // CHECK-O3: ret i1 true
1531884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson  return A().a.data == 0;
1541884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson}
1551884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson
156a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson// CHECK-O3: define zeroext i1 @_ZN6PR71396check2Ev() nounwind readnone
157a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlssonbool check2() {
158a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  // CHECK-O3: ret i1 true
159a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson  return ptr_to_member_type() == 0;
160a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson}
161a40a9f31218c743e366322e34b59f0d4d4414198Anders Carlsson
1621884eb0b5c55edda4893ddec45e7dbad79758782Anders Carlsson}
1630a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1640a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonnamespace VirtualBases {
1650a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1660a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct A {
1670a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  char c;
1680a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson  int A::*i;
1690a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson};
1700a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1710a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson// FIXME: A::i should be initialized to -1 here.
1720a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct B : virtual A { };
1730a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonB b;
1740a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1750a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson// FIXME: A::i should be initialized to -1 here.
1760a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct C : virtual A { int A::*i; };
1770a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonC c;
1780a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1790a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson// FIXME: C::A::i should be initialized to -1 here.
1800a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlssonstruct D : C { int A::*i; };
1810a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders CarlssonD d;
1820a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson
1830a87b377d9a8af87ebc99585be96aac2d36ccfcbAnders Carlsson}
184e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
185e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonnamespace Test1 {
186e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
187e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson// Don't crash when A contains a bit-field.
188e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlssonstruct A {
189e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int A::* a;
190e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson  int b : 10;
191e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson};
192e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders CarlssonA a;
193e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson
194e9a05b7fd6ece68310707d10bc747a702a9af4a8Anders Carlsson}
195b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
196b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregornamespace BoolPtrToMember {
197b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  struct X {
198b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    bool member;
199b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  };
200b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor
201b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  // CHECK: define i8* @_ZN15BoolPtrToMember1fERNS_1XEMS0_b
202b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  bool &f(X &x, bool X::*member) {
203b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK: {{bitcast.* to i8\*}}
204b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK-NEXT: getelementptr inbounds i8*
205b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    // CHECK-NEXT: ret i8*
206b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor    return x.*member;
207b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor  }
208b61e2a328c5c2552b0bb3a8d3c4bc9389f34a321Douglas Gregor}
20996e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
21096e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonnamespace PR8507 {
21196e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
21296e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonstruct S;
21396e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlssonvoid f(S* p, double S::*pm) {
21496e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  if (0 < p->*pm) {
21596e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson  }
21696e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
21796e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
21896e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson}
21996e93660124c8028a4c3bcc038ab0cdd18cd7ab2Anders Carlsson
220