Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 struct A {
      3 };
      4 
      5 struct ConvertibleToA {
      6   operator A();
      7 };
      8 
      9 struct ConvertibleToConstA {
     10   operator const A();
     11 };
     12 
     13 struct B {
     14   B& operator=(B&);  // expected-note 4 {{candidate function}}
     15 };
     16 
     17 struct ConvertibleToB {
     18   operator B();
     19 };
     20 
     21 struct ConvertibleToBref {
     22   operator B&();
     23 };
     24 
     25 struct ConvertibleToConstB {
     26   operator const B();
     27 };
     28 
     29 struct ConvertibleToConstBref {
     30   operator const B&();
     31 };
     32 
     33 struct C {
     34   int operator=(int); // expected-note{{candidate function}}
     35   long operator=(long); // expected-note{{candidate function}}
     36   int operator+=(int); // expected-note{{candidate function}}
     37   int operator+=(long); // expected-note{{candidate function}}
     38 };
     39 
     40 struct D {
     41   D& operator+=(const D &);
     42 };
     43 
     44 struct ConvertibleToInt {
     45   operator int();
     46 };
     47 
     48 void test() {
     49   A a, na;
     50   const A constA = A();
     51   ConvertibleToA convertibleToA;
     52   ConvertibleToConstA convertibleToConstA;
     53 
     54   B b, nb;
     55   const B constB = B();
     56   ConvertibleToB convertibleToB;
     57   ConvertibleToBref convertibleToBref;
     58   ConvertibleToConstB convertibleToConstB;
     59   ConvertibleToConstBref convertibleToConstBref;
     60 
     61   C c, nc;
     62   const C constC = C();
     63 
     64   D d, nd;
     65   const D constD = D();
     66 
     67   ConvertibleToInt convertibleToInt;
     68 
     69   na = a;
     70   na = constA;
     71   na = convertibleToA;
     72   na = convertibleToConstA;
     73   na += a; // expected-error{{no viable overloaded '+='}}
     74 
     75   nb = b;
     76   nb = constB;  // expected-error{{no viable overloaded '='}}
     77   nb = convertibleToB; // expected-error{{no viable overloaded '='}}
     78   nb = convertibleToBref;
     79   nb = convertibleToConstB; // expected-error{{no viable overloaded '='}}
     80   nb = convertibleToConstBref; // expected-error{{no viable overloaded '='}}
     81 
     82   nc = c;
     83   nc = constC;
     84   nc = 1;
     85   nc = 1L;
     86   nc = 1.0; // expected-error{{use of overloaded operator '=' is ambiguous}}
     87   nc += 1;
     88   nc += 1L;
     89   nc += 1.0; // expected-error{{use of overloaded operator '+=' is ambiguous}}
     90 
     91   nd = d;
     92   nd += d;
     93   nd += constD;
     94 
     95   int i;
     96   i = convertibleToInt;
     97   i = a; // expected-error{{assigning to 'int' from incompatible type 'A'}}
     98 }
     99 
    100 // <rdar://problem/8315440>: Don't crash
    101 namespace test1 {
    102   template<typename T> class A : public unknown::X { // expected-error {{undeclared identifier 'unknown'}} expected-error {{expected class name}}
    103     A(UndeclaredType n) : X(n) {} // expected-error {{unknown type name 'UndeclaredType'}}
    104   };
    105   template<typename T> class B : public A<T>     {
    106     virtual void foo() {}
    107   };
    108   extern template class A<char>;
    109   extern template class B<char>;
    110 }
    111