Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 struct X {
      3   operator bool();
      4 };
      5 
      6 int& f(bool);
      7 float& f(int);
      8 
      9 void f_test(X x) {
     10   int& i1 = f(x);
     11 }
     12 
     13 struct Y {
     14   operator short();
     15   operator float();
     16 };
     17 
     18 void g(int);
     19 
     20 void g_test(Y y) {
     21   g(y);
     22   short s;
     23   s = y;
     24 }
     25 
     26 struct A { };
     27 struct B : A { };
     28 
     29 struct C {
     30   operator B&();
     31 };
     32 
     33 // Test reference binding via an lvalue conversion function.
     34 void h(volatile A&);
     35 void h_test(C c) {
     36   h(c);
     37 }
     38 
     39 // Test conversion followed by copy-construction
     40 struct FunkyDerived;
     41 
     42 struct Base {
     43   Base(const FunkyDerived&);
     44 };
     45 
     46 struct Derived : Base { };
     47 
     48 struct FunkyDerived : Base { };
     49 
     50 struct ConvertibleToBase {
     51   operator Base();
     52 };
     53 
     54 struct ConvertibleToDerived {
     55   operator Derived();
     56 };
     57 
     58 struct ConvertibleToFunkyDerived {
     59   operator FunkyDerived();
     60 };
     61 
     62 void test_conversion(ConvertibleToBase ctb, ConvertibleToDerived ctd,
     63                      ConvertibleToFunkyDerived ctfd) {
     64   Base b1 = ctb;
     65   Base b2(ctb);
     66   Base b3 = ctd;
     67   Base b4(ctd);
     68   Base b5 = ctfd;
     69 }
     70 
     71 struct X1 {
     72   X1(X1&); // expected-note{{candidate constructor not viable: expects an l-value for 1st argument}}
     73 };
     74 
     75 struct X2 {
     76   operator X1();
     77 };
     78 
     79 int &f(X1);
     80 float &f(...);
     81 
     82 void g(X2 b) {
     83   int &ir = f(b); // expected-error{{no viable constructor copying parameter of type 'X1'}}
     84 }
     85 
     86 namespace rdar10202900 {
     87   class A {
     88   public:
     89     A();
     90 
     91   private:
     92     A(int i); // expected-note{{declared private here}}
     93   };
     94 
     95   void testA(A a) {
     96     int b = 10;
     97     a = b; // expected-error{{calling a private constructor of class 'rdar10202900::A'}}
     98   }
     99 }
    100