1*9ca5c425SRichard Smith // RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -S %s -o %t-64.s 28b576979SDaniel Dunbar // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s 3*9ca5c425SRichard Smith // RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -S %s -o %t-32.s 48b576979SDaniel Dunbar // RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s 52a58948dSAnders Carlsson // XFAIL: * 67cee2031SFariborz Jahanian extern "C" int printf(...); 76c0a6e49SAnders Carlsson struct S { 86c0a6e49SAnders Carlsson operator int(); 96c0a6e49SAnders Carlsson }; 106c0a6e49SAnders Carlsson 116c0a6e49SAnders Carlsson S::operator int() { 126c0a6e49SAnders Carlsson return 10; 136c0a6e49SAnders Carlsson } 147cee2031SFariborz Jahanian 15b396f435SAnders Carlsson int f(S s) { 16b396f435SAnders Carlsson return s; 17b396f435SAnders Carlsson } 187cee2031SFariborz Jahanian 197cee2031SFariborz Jahanian class X { // ... 207cee2031SFariborz Jahanian public: operator int() { printf("operator int()\n"); return iX; } 217cee2031SFariborz Jahanian public: operator float() { printf("operator float()\n"); return fX; } 227cee2031SFariborz Jahanian X() : iX(100), fX(1.234) {} 237cee2031SFariborz Jahanian int iX; 247cee2031SFariborz Jahanian float fX; 257cee2031SFariborz Jahanian }; 267cee2031SFariborz Jahanian 277cee2031SFariborz Jahanian X x; 287cee2031SFariborz Jahanian 297cee2031SFariborz Jahanian struct Z { 307cee2031SFariborz Jahanian operator X() { printf("perator X()\n"); x.iX += iZ; x.fX += fZ; return x; } 317cee2031SFariborz Jahanian int iZ; 327cee2031SFariborz Jahanian float fZ; 337cee2031SFariborz Jahanian Z() : iZ(1), fZ(1.00) {} 347cee2031SFariborz Jahanian }; 357cee2031SFariborz Jahanian 367cee2031SFariborz Jahanian Z z; 377cee2031SFariborz Jahanian 387cee2031SFariborz Jahanian class Y { // ... 397cee2031SFariborz Jahanian public: operator Z(){printf("perator Z()\n"); return z; } 407cee2031SFariborz Jahanian }; 417cee2031SFariborz Jahanian 427cee2031SFariborz Jahanian Y y; 437cee2031SFariborz Jahanian 440a484d00SFariborz Jahanian int count=0; 450a484d00SFariborz Jahanian class O { // ... 460a484d00SFariborz Jahanian public: 470a484d00SFariborz Jahanian operator int(){ return ++iO; } 480a484d00SFariborz Jahanian O() : iO(count++) {} 490a484d00SFariborz Jahanian int iO; 500a484d00SFariborz Jahanian }; 510a484d00SFariborz Jahanian 5211289f42SMike Stump void g(O a, O b) { 530a484d00SFariborz Jahanian int i = (a) ? 1+a : 0; 540a484d00SFariborz Jahanian int j = (a&&b) ? a+b : i; 550a484d00SFariborz Jahanian if (a) { } 560a484d00SFariborz Jahanian printf("i = %d j = %d a.iO = %d b.iO = %d\n", i, j, a.iO, b.iO); 570a484d00SFariborz Jahanian } 580a484d00SFariborz Jahanian 597cee2031SFariborz Jahanian int main() { 607cee2031SFariborz Jahanian int c = X(Z(y)); // OK: y.operator Z().operator X().operator int() 617cee2031SFariborz Jahanian printf("c = %d\n", c); 627cee2031SFariborz Jahanian float f = X(Z(y)); 637cee2031SFariborz Jahanian printf("f = %f\n", f); 647cee2031SFariborz Jahanian int i = x; 657cee2031SFariborz Jahanian printf("i = %d float = %f\n", i, float(x)); 667cee2031SFariborz Jahanian i = int(X(Z(y))); 677cee2031SFariborz Jahanian f = float(X(Z(y))); 687cee2031SFariborz Jahanian printf("i = %d float = %f\n", i,f); 693df87678SFariborz Jahanian f = (float)x; 703df87678SFariborz Jahanian i = (int)x; 713df87678SFariborz Jahanian printf("i = %d float = %f\n", i,f); 723df87678SFariborz Jahanian 733df87678SFariborz Jahanian int d = (X)((Z)y); 743df87678SFariborz Jahanian printf("d = %d\n", d); 753df87678SFariborz Jahanian 763df87678SFariborz Jahanian int e = (int)((X)((Z)y)); 773df87678SFariborz Jahanian printf("e = %d\n", e); 780a484d00SFariborz Jahanian O o1, o2; 790a484d00SFariborz Jahanian g(o1, o2); 807cee2031SFariborz Jahanian } 8111289f42SMike Stump 82f4061e39SFariborz Jahanian // Test. Conversion in base class is visible in derived class. 83f4061e39SFariborz Jahanian class XB { 846b2737d5SAnders Carlsson int a; 85f4061e39SFariborz Jahanian public: 86f4061e39SFariborz Jahanian operator int(); 87f4061e39SFariborz Jahanian }; 88f4061e39SFariborz Jahanian 89f4061e39SFariborz Jahanian class Yb : public XB { 906b2737d5SAnders Carlsson double b; 91f4061e39SFariborz Jahanian public: 92f4061e39SFariborz Jahanian operator char(); 93f4061e39SFariborz Jahanian }; 94f4061e39SFariborz Jahanian 95f4061e39SFariborz Jahanian void f(Yb& a) { 96f4061e39SFariborz Jahanian int i = a; // OK. calls XB::operator int(); 97f4061e39SFariborz Jahanian char ch = a; // OK. calls Yb::operator char(); 98f4061e39SFariborz Jahanian } 99f4061e39SFariborz Jahanian 100b396f435SAnders Carlsson struct A { 101b396f435SAnders Carlsson operator int() const; 102b396f435SAnders Carlsson }; 103f4061e39SFariborz Jahanian 1047cee2031SFariborz Jahanian // CHECK-LP64: .globl __ZN1ScviEv 1057cee2031SFariborz Jahanian // CHECK-LP64-NEXT: __ZN1ScviEv: 10612ca3f46SSean Callanan // CHECK-LP64: callq __ZN1Ycv1ZEv 10712ca3f46SSean Callanan // CHECK-LP64: callq __ZN1Zcv1XEv 10812ca3f46SSean Callanan // CHECK-LP64: callq __ZN1XcviEv 10912ca3f46SSean Callanan // CHECK-LP64: callq __ZN1XcvfEv 11012ca3f46SSean Callanan // CHECK-LP64: callq __ZN2XBcviEv 11112ca3f46SSean Callanan // CHECK-LP64: callq __ZN2YbcvcEv 1127cee2031SFariborz Jahanian 1137cee2031SFariborz Jahanian // CHECK-LP32: .globl __ZN1ScviEv 1147cee2031SFariborz Jahanian // CHECK-LP32-NEXT: __ZN1ScviEv: 1157cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Ycv1ZEv 1167cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1Zcv1XEv 1177cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcviEv 1187cee2031SFariborz Jahanian // CHECK-LP32: call L__ZN1XcvfEv 119f4061e39SFariborz Jahanian // CHECK-LP32: call L__ZN2XBcviEv 120f4061e39SFariborz Jahanian // CHECK-LP32: call L__ZN2YbcvcEv 121