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