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