1*7cee2031SFariborz Jahanian // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && 2*7cee2031SFariborz Jahanian // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && 3*7cee2031SFariborz Jahanian // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && 4*7cee2031SFariborz Jahanian // RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && 5*7cee2031SFariborz Jahanian // RUN: true 6*7cee2031SFariborz Jahanian 7*7cee2031SFariborz Jahanian extern "C" int printf(...); 86c0a6e49SAnders Carlsson struct S { 96c0a6e49SAnders Carlsson operator int(); 106c0a6e49SAnders Carlsson }; 116c0a6e49SAnders Carlsson 126c0a6e49SAnders Carlsson S::operator int() { 136c0a6e49SAnders Carlsson return 10; 146c0a6e49SAnders Carlsson } 15*7cee2031SFariborz Jahanian 16*7cee2031SFariborz Jahanian 17*7cee2031SFariborz Jahanian class X { // ... 18*7cee2031SFariborz Jahanian public: operator int() { printf("operator int()\n"); return iX; } 19*7cee2031SFariborz Jahanian public: operator float() { printf("operator float()\n"); return fX; } 20*7cee2031SFariborz Jahanian X() : iX(100), fX(1.234) {} 21*7cee2031SFariborz Jahanian int iX; 22*7cee2031SFariborz Jahanian float fX; 23*7cee2031SFariborz Jahanian }; 24*7cee2031SFariborz Jahanian 25*7cee2031SFariborz Jahanian X x; 26*7cee2031SFariborz Jahanian 27*7cee2031SFariborz Jahanian struct Z { 28*7cee2031SFariborz Jahanian operator X() { printf("perator X()\n"); x.iX += iZ; x.fX += fZ; return x; } 29*7cee2031SFariborz Jahanian int iZ; 30*7cee2031SFariborz Jahanian float fZ; 31*7cee2031SFariborz Jahanian Z() : iZ(1), fZ(1.00) {} 32*7cee2031SFariborz Jahanian }; 33*7cee2031SFariborz Jahanian 34*7cee2031SFariborz Jahanian Z z; 35*7cee2031SFariborz Jahanian 36*7cee2031SFariborz Jahanian class Y { // ... 37*7cee2031SFariborz Jahanian public: operator Z(){printf("perator Z()\n"); return z; } 38*7cee2031SFariborz Jahanian }; 39*7cee2031SFariborz Jahanian 40*7cee2031SFariborz Jahanian Y y; 41*7cee2031SFariborz Jahanian 42*7cee2031SFariborz Jahanian int main() { 43*7cee2031SFariborz Jahanian int c = X(Z(y)); // OK: y.operator Z().operator X().operator int() 44*7cee2031SFariborz Jahanian printf("c = %d\n", c); 45*7cee2031SFariborz Jahanian float f = X(Z(y)); 46*7cee2031SFariborz Jahanian printf("f = %f\n", f); 47*7cee2031SFariborz Jahanian int i = x; 48*7cee2031SFariborz Jahanian printf("i = %d float = %f\n", i, float(x)); 49*7cee2031SFariborz Jahanian i = int(X(Z(y))); 50*7cee2031SFariborz Jahanian f = float(X(Z(y))); 51*7cee2031SFariborz Jahanian printf("i = %d float = %f\n", i,f); 52*7cee2031SFariborz Jahanian } 53*7cee2031SFariborz Jahanian // CHECK-LP64: .globl __ZN1ScviEv 54*7cee2031SFariborz Jahanian // CHECK-LP64-NEXT: __ZN1ScviEv: 55*7cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1Ycv1ZEv 56*7cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1Zcv1XEv 57*7cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1XcviEv 58*7cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1XcvfEv 59*7cee2031SFariborz Jahanian 60*7cee2031SFariborz Jahanian // CHECK-LP32: .globl __ZN1ScviEv 61*7cee2031SFariborz Jahanian // CHECK-LP32-NEXT: __ZN1ScviEv: 62*7cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Ycv1ZEv 63*7cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Zcv1XEv 64*7cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcviEv 65*7cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcvfEv 66