1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -triple x86_64-apple-darwin -std=c++11 -S %s -o %t-64.s 2931a4feb64f18190d189c222d61b2abf52f18ab8Tim Northover// RUN: FileCheck -check-prefix CHECK-LP64 --input-file=%t-64.s %s 3762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -triple i386-apple-darwin -std=c++11 -S %s -o %t-32.s 4931a4feb64f18190d189c222d61b2abf52f18ab8Tim Northover// RUN: FileCheck -check-prefix CHECK-LP32 --input-file=%t-32.s %s 5798345c69505226a33258177fa6e06275ef59595Anders Carlsson// XFAIL: * 6d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanianextern "C" int printf(...); 7293361afd4199c92aabff9267fddea890943c586Anders Carlssonstruct S { 81eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump operator int(); 9293361afd4199c92aabff9267fddea890943c586Anders Carlsson}; 10293361afd4199c92aabff9267fddea890943c586Anders Carlsson 11293361afd4199c92aabff9267fddea890943c586Anders CarlssonS::operator int() { 121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return 10; 13293361afd4199c92aabff9267fddea890943c586Anders Carlsson} 14d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 150ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlssonint f(S s) { 160ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson return s; 170ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson} 18d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 19d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanianclass X { // ... 20d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian public: operator int() { printf("operator int()\n"); return iX; } 21d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian public: operator float() { printf("operator float()\n"); return fX; } 22d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian X() : iX(100), fX(1.234) {} 23d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian int iX; 24d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian float fX; 25d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian}; 26d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 27d8417784e415cefba220c8fae5f6de4322a539deFariborz JahanianX x; 28d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 29d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanianstruct Z { 30d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian operator X() { printf("perator X()\n"); x.iX += iZ; x.fX += fZ; return x; } 31d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian int iZ; 32d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian float fZ; 33d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian Z() : iZ(1), fZ(1.00) {} 34d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian}; 35d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 36d8417784e415cefba220c8fae5f6de4322a539deFariborz JahanianZ z; 37d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 38d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanianclass Y { // ... 39d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian public: operator Z(){printf("perator Z()\n"); return z; } 40d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian}; 41d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 42d8417784e415cefba220c8fae5f6de4322a539deFariborz JahanianY y; 43d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 44383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanianint count=0; 45383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanianclass O { // ... 46383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanianpublic: 471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump operator int(){ return ++iO; } 481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump O() : iO(count++) {} 491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int iO; 50383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanian}; 51383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanian 521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid g(O a, O b) { 531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int i = (a) ? 1+a : 0; 541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int j = (a&&b) ? a+b : i; 551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (a) { } 561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("i = %d j = %d a.iO = %d b.iO = %d\n", i, j, a.iO, b.iO); 57383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanian} 58383d29853331e4f6c0c720a1df9cab31f6ab3dbaFariborz Jahanian 59d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanianint main() { 601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int c = X(Z(y)); // OK: y.operator Z().operator X().operator int() 611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("c = %d\n", c); 621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump float f = X(Z(y)); 631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("f = %f\n", f); 641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int i = x; 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("i = %d float = %f\n", i, float(x)); 661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump i = int(X(Z(y))); 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump f = float(X(Z(y))); 681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("i = %d float = %f\n", i,f); 691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump f = (float)x; 701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump i = (int)x; 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("i = %d float = %f\n", i,f); 721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int d = (X)((Z)y); 741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("d = %d\n", d); 751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump int e = (int)((X)((Z)y)); 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("e = %d\n", e); 781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump O o1, o2; 791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump g(o1, o2); 80d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian} 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 82b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian// Test. Conversion in base class is visible in derived class. 83b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanianclass XB { 84aac6e3a6bbca5952263648e70cbd56d9f89cf4a2Anders Carlsson int a; 85b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanianpublic: 86b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian operator int(); 87b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian}; 88b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian 89b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanianclass Yb : public XB { 90aac6e3a6bbca5952263648e70cbd56d9f89cf4a2Anders Carlsson double b; 91b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanianpublic: 92b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian operator char(); 93b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian}; 94b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian 95b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanianvoid f(Yb& a) { 96b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian int i = a; // OK. calls XB::operator int(); 97b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian char ch = a; // OK. calls Yb::operator char(); 98b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian} 99b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian 1000ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlssonstruct A { 1010ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson operator int() const; 1020ddb6f7506d3bffe4e526f877d3ef48e8d942b1dAnders Carlsson}; 103b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian 1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CHECK-LP64: .globl __ZN1ScviEv 105d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian// CHECK-LP64-NEXT: __ZN1ScviEv: 1063b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1Ycv1ZEv 1073b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1Zcv1XEv 1083b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1XcviEv 1093b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN1XcvfEv 1103b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN2XBcviEv 1113b29901b1d106789e04ce8c4cdfebe72b251db4bSean Callanan// CHECK-LP64: callq __ZN2YbcvcEv 112d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian 113d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian// CHECK-LP32: .globl __ZN1ScviEv 114d8417784e415cefba220c8fae5f6de4322a539deFariborz Jahanian// CHECK-LP32-NEXT: __ZN1ScviEv: 1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CHECK-LP32: call L__ZN1Ycv1ZEv 1161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CHECK-LP32: call L__ZN1Zcv1XEv 1171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CHECK-LP32: call L__ZN1XcviEv 1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// CHECK-LP32: call L__ZN1XcvfEv 119b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian// CHECK-LP32: call L__ZN2XBcviEv 120b191e2dda9f4dc033cb21f9625a78fe80d4ac105Fariborz Jahanian// CHECK-LP32: call L__ZN2YbcvcEv 121