1 // RUN: clang-cc -triple x86_64-apple-darwin -std=c++0x -S %s -o %t-64.s && 2 // RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s && 3 // RUN: clang-cc -triple i386-apple-darwin -std=c++0x -S %s -o %t-32.s && 4 // RUN: FileCheck -check-prefix LP32 --input-file=%t-32.s %s && 5 // RUN: true 6 7 extern "C" int printf(...); 8 struct S { 9 operator int(); 10 }; 11 12 S::operator int() { 13 return 10; 14 } 15 16 17 class X { // ... 18 public: operator int() { printf("operator int()\n"); return iX; } 19 public: operator float() { printf("operator float()\n"); return fX; } 20 X() : iX(100), fX(1.234) {} 21 int iX; 22 float fX; 23 }; 24 25 X x; 26 27 struct Z { 28 operator X() { printf("perator X()\n"); x.iX += iZ; x.fX += fZ; return x; } 29 int iZ; 30 float fZ; 31 Z() : iZ(1), fZ(1.00) {} 32 }; 33 34 Z z; 35 36 class Y { // ... 37 public: operator Z(){printf("perator Z()\n"); return z; } 38 }; 39 40 Y y; 41 42 int count=0; 43 class O { // ... 44 public: 45 operator int(){ return ++iO; } 46 O() : iO(count++) {} 47 int iO; 48 }; 49 50 void g(O a, O b) { 51 int i = (a) ? 1+a : 0; 52 int j = (a&&b) ? a+b : i; 53 if (a) { } 54 printf("i = %d j = %d a.iO = %d b.iO = %d\n", i, j, a.iO, b.iO); 55 } 56 57 int main() { 58 int c = X(Z(y)); // OK: y.operator Z().operator X().operator int() 59 printf("c = %d\n", c); 60 float f = X(Z(y)); 61 printf("f = %f\n", f); 62 int i = x; 63 printf("i = %d float = %f\n", i, float(x)); 64 i = int(X(Z(y))); 65 f = float(X(Z(y))); 66 printf("i = %d float = %f\n", i,f); 67 f = (float)x; 68 i = (int)x; 69 printf("i = %d float = %f\n", i,f); 70 71 int d = (X)((Z)y); 72 printf("d = %d\n", d); 73 74 int e = (int)((X)((Z)y)); 75 printf("e = %d\n", e); 76 O o1, o2; 77 g(o1, o2); 78 } 79 80 // Test. Conversion in base class is visible in derived class. 81 class XB { 82 public: 83 operator int(); 84 }; 85 86 class Yb : public XB { 87 public: 88 operator char(); 89 }; 90 91 void f(Yb& a) { 92 int i = a; // OK. calls XB::operator int(); 93 char ch = a; // OK. calls Yb::operator char(); 94 } 95 96 97 // CHECK-LP64: .globl __ZN1ScviEv 98 // CHECK-LP64-NEXT: __ZN1ScviEv: 99 // CHECK-LP64: call __ZN1Ycv1ZEv 100 // CHECK-LP64: call __ZN1Zcv1XEv 101 // CHECK-LP64: call __ZN1XcviEv 102 // CHECK-LP64: call __ZN1XcvfEv 103 // CHECK-LP64: call __ZN2XBcviEv 104 // CHECK-LP64: call __ZN2YbcvcEv 105 106 // CHECK-LP32: .globl __ZN1ScviEv 107 // CHECK-LP32-NEXT: __ZN1ScviEv: 108 // CHECK-LP32: call L__ZN1Ycv1ZEv 109 // CHECK-LP32: call L__ZN1Zcv1XEv 110 // CHECK-LP32: call L__ZN1XcviEv 111 // CHECK-LP32: call L__ZN1XcvfEv 112 // CHECK-LP32: call L__ZN2XBcviEv 113 // CHECK-LP32: call L__ZN2YbcvcEv 114