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