Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
      2 // RUN: %clang_cc1 -fsyntax-only -verify %s
      3 
      4 namespace test0 {
      5   struct A { // expected-note {{candidate function (the implicit copy assignment operator) not viable: 'this' argument has type 'const test0::A', but method is not marked const}}
      6 #if __cplusplus >= 201103L
      7   // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable: 'this' argument has type 'const test0::A', but method is not marked const}}
      8 #endif
      9     A &operator=(void*); // expected-note {{candidate function not viable: 'this' argument has type 'const test0::A', but method is not marked const}}
     10   };
     11 
     12   void test(const A &a) {
     13     a = "help"; // expected-error {{no viable overloaded '='}}
     14   }
     15 }
     16 
     17 namespace PR16314 {
     18   void f(char*);
     19   int &f(...);
     20   void x()
     21   {
     22     int &n = f("foo");
     23 #if __cplusplus < 201103L
     24     // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     25     // expected-error@-3 {{non-const lvalue reference to type 'int' cannot bind to a temporary of type 'void'}}
     26 #endif
     27   }
     28 }
     29 
     30 namespace warn_if_best {
     31   int f(char *);
     32   void f(double);
     33   void x()
     34   {
     35     int n = f("foo");
     36 #if __cplusplus < 201103L
     37     // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     38 #else
     39     // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}}
     40 #endif
     41   }
     42 }
     43 
     44 namespace userdefined_vs_illformed {
     45   struct X { X(const char *); };
     46 
     47   void *f(char *p); // best for C++03
     48   double f(X x);  // best for C++11
     49   void g()
     50   {
     51     double d = f("foo");
     52 #if __cplusplus < 201103L
     53     // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     54     // expected-error@-3 {{cannot initialize a variable of type 'double' with an rvalue of type 'void *'}}
     55 #endif
     56   }
     57 }
     58 
     59 namespace sfinae_test {
     60   int f(int, char*);
     61 
     62   template<int T>
     63   struct S { typedef int type; };
     64 
     65   template<>
     66   struct S<sizeof(int)> { typedef void type; };
     67 
     68   // C++11: SFINAE failure
     69   // C++03: ok
     70   template<typename T> int cxx11_ignored(T, typename S<sizeof(f(T(), "foo"))>::type *);
     71 #if __cplusplus < 201103L
     72   // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     73 #else
     74   // expected-note@-4 {{candidate template ignored: substitution failure}}
     75 #endif
     76 
     77   // C++11: better than latter
     78   // C++03: worse than latter
     79   template<typename T> void g(T, ...);
     80   template<typename T> int g(T, typename S<sizeof(f(T(), "foo"))>::type *);
     81 #if __cplusplus < 201103L
     82   // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     83 #endif
     84 
     85   int a = cxx11_ignored(0, 0);
     86   int b = g(0, 0);
     87 #if __cplusplus >= 201103L
     88   // expected-error@-3 {{no matching function for call to 'cxx11_ignored'}}
     89   // expected-error@-3 {{cannot initialize a variable of type 'int' with an rvalue of type 'void'}}
     90 #endif
     91 }
     92