Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
      2 
      3 template <class T>
      4 struct only
      5 {
      6     only(T) {}
      7 
      8     template <class U>
      9     only(U)
     10     {
     11         static_assert(sizeof(U) == 0, "expected type failure");
     12     }
     13 };
     14 
     15 auto f() -> int
     16 {
     17     return 0;
     18 }
     19 
     20 auto g(); // expected-error{{return without trailing return type}}
     21 
     22 int h() -> int; // expected-error{{trailing return type must specify return type 'auto', not 'int'}}
     23 
     24 int i();
     25 auto i() -> int;
     26 int i() {}
     27 
     28 using T = auto (int) -> auto (*)(char) -> void; // expected-note {{previous}}
     29 using T = void; // expected-error {{type alias redefinition with different types ('void' vs 'auto (int) -> auto (*)(char) -> void')}}
     30 
     31 using U = auto (int) -> auto (*)(char) -> void;
     32 using U = void (*(int))(char); // ok
     33 
     34 int x;
     35 
     36 template <class T>
     37 auto i(T x) -> decltype(x)
     38 {
     39     return x;
     40 }
     41 
     42 only<double> p1 = i(1.0);
     43 
     44 template <class T>
     45 struct X
     46 {
     47     auto f(T x) -> T { return x; }
     48 
     49     template <class U>
     50     auto g(T x, U y) -> decltype(x + y)
     51     {
     52         return x + y;
     53     }
     54 
     55   template<typename U>
     56   struct nested {
     57     template <class V>
     58     auto h(T x, U y, V z) -> decltype(x + y + z)
     59     {
     60         return x + y + z;
     61     }
     62   };
     63 
     64   template<typename U>
     65   nested<U> get_nested();
     66 };
     67 
     68 X<int> xx;
     69 only<int> p2 = xx.f(0L);
     70 only<double> p3 = xx.g(0L, 1.0);
     71 only<double> p4 = xx.get_nested<double>().h(0L, 1.0, 3.14f);
     72 
     73 namespace PR12053 {
     74   template <typename T>
     75   auto f1(T t) -> decltype(f1(t)) {} // expected-note{{candidate template ignored}}
     76 
     77   void test_f1() {
     78     f1(0); // expected-error{{no matching function for call to 'f1'}}
     79   }
     80 
     81   template <typename T>
     82   auto f2(T t) -> decltype(f2(&t)) {} // expected-note{{candidate template ignored}}
     83 
     84   void test_f2() {
     85     f2(0); // expected-error{{no matching function for call to 'f2'}}
     86   }
     87 }
     88