17cee2031SFariborz Jahanian // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && 27cee2031SFariborz Jahanian // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && 37cee2031SFariborz Jahanian // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && 47cee2031SFariborz Jahanian // RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && 57cee2031SFariborz Jahanian // RUN: true 67cee2031SFariborz Jahanian 77cee2031SFariborz 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 } 157cee2031SFariborz Jahanian 167cee2031SFariborz Jahanian 177cee2031SFariborz Jahanian class X { // ... 187cee2031SFariborz Jahanian public: operator int() { printf("operator int()\n"); return iX; } 197cee2031SFariborz Jahanian public: operator float() { printf("operator float()\n"); return fX; } 207cee2031SFariborz Jahanian X() : iX(100), fX(1.234) {} 217cee2031SFariborz Jahanian int iX; 227cee2031SFariborz Jahanian float fX; 237cee2031SFariborz Jahanian }; 247cee2031SFariborz Jahanian 257cee2031SFariborz Jahanian X x; 267cee2031SFariborz Jahanian 277cee2031SFariborz Jahanian struct Z { 287cee2031SFariborz Jahanian operator X() { printf("perator X()\n"); x.iX += iZ; x.fX += fZ; return x; } 297cee2031SFariborz Jahanian int iZ; 307cee2031SFariborz Jahanian float fZ; 317cee2031SFariborz Jahanian Z() : iZ(1), fZ(1.00) {} 327cee2031SFariborz Jahanian }; 337cee2031SFariborz Jahanian 347cee2031SFariborz Jahanian Z z; 357cee2031SFariborz Jahanian 367cee2031SFariborz Jahanian class Y { // ... 377cee2031SFariborz Jahanian public: operator Z(){printf("perator Z()\n"); return z; } 387cee2031SFariborz Jahanian }; 397cee2031SFariborz Jahanian 407cee2031SFariborz Jahanian Y y; 417cee2031SFariborz Jahanian 427cee2031SFariborz Jahanian int main() { 437cee2031SFariborz Jahanian int c = X(Z(y)); // OK: y.operator Z().operator X().operator int() 447cee2031SFariborz Jahanian printf("c = %d\n", c); 457cee2031SFariborz Jahanian float f = X(Z(y)); 467cee2031SFariborz Jahanian printf("f = %f\n", f); 477cee2031SFariborz Jahanian int i = x; 487cee2031SFariborz Jahanian printf("i = %d float = %f\n", i, float(x)); 497cee2031SFariborz Jahanian i = int(X(Z(y))); 507cee2031SFariborz Jahanian f = float(X(Z(y))); 517cee2031SFariborz Jahanian printf("i = %d float = %f\n", i,f); 52*3df87678SFariborz Jahanian f = (float)x; 53*3df87678SFariborz Jahanian i = (int)x; 54*3df87678SFariborz Jahanian printf("i = %d float = %f\n", i,f); 55*3df87678SFariborz Jahanian 56*3df87678SFariborz Jahanian int d = (X)((Z)y); 57*3df87678SFariborz Jahanian printf("d = %d\n", d); 58*3df87678SFariborz Jahanian 59*3df87678SFariborz Jahanian int e = (int)((X)((Z)y)); 60*3df87678SFariborz Jahanian printf("e = %d\n", e); 617cee2031SFariborz Jahanian } 627cee2031SFariborz Jahanian // CHECK-LP64: .globl __ZN1ScviEv 637cee2031SFariborz Jahanian // CHECK-LP64-NEXT: __ZN1ScviEv: 647cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1Ycv1ZEv 657cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1Zcv1XEv 667cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1XcviEv 677cee2031SFariborz Jahanian // CHECK-LP64: call __ZN1XcvfEv 687cee2031SFariborz Jahanian 697cee2031SFariborz Jahanian // CHECK-LP32: .globl __ZN1ScviEv 707cee2031SFariborz Jahanian // CHECK-LP32-NEXT: __ZN1ScviEv: 717cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Ycv1ZEv 727cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Zcv1XEv 737cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcviEv 747cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcvfEv 75