| 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; deduced return types are a C++14 extension}} |
| 21 | decltype(auto) g2(); // expected-warning{{extension}} expected-error-re{{{{^}}deduced return types are a C++14 extension}} |
| 22 | auto badness = g2(); |
| 23 | |
| 24 | int h() -> int; // expected-error{{trailing return type must specify return type 'auto', not 'int'}} |
| 25 | |
| 26 | int i(); |
| 27 | auto i() -> int; |
| 28 | int i() {} |
| 29 | |
| 30 | using T = auto (int) -> auto (*)(char) -> void; // expected-note {{previous}} |
| 31 | using T = void; // expected-error {{type alias redefinition with different types ('void' vs 'auto (int) -> auto (*)(char) -> void')}} |
| 32 | |
| 33 | using U = auto (int) -> auto (*)(char) -> void; |
| 34 | using U = void (*(int))(char); // ok |
| 35 | |
| 36 | int x; |
| 37 | |
| 38 | template <class T> |
| 39 | auto i(T x) -> decltype(x) |
| 40 | { |
| 41 | return x; |
| 42 | } |
| 43 | |
| 44 | only<double> p1 = i(1.0); |
| 45 | |
| 46 | template <class T> |
| 47 | struct X |
| 48 | { |
| 49 | auto f(T x) -> T { return x; } |
| 50 | |
| 51 | template <class U> |
| 52 | auto g(T x, U y) -> decltype(x + y) |
| 53 | { |
| 54 | return x + y; |
| 55 | } |
| 56 | |
| 57 | template<typename U> |
| 58 | struct nested { |
| 59 | template <class V> |
| 60 | auto h(T x, U y, V z) -> decltype(x + y + z) |
| 61 | { |
| 62 | return x + y + z; |
| 63 | } |
| 64 | }; |
| 65 | |
| 66 | template<typename U> |
| 67 | nested<U> get_nested(); |
| 68 | }; |
| 69 | |
| 70 | X<int> xx; |
| 71 | only<int> p2 = xx.f(0L); |
| 72 | only<double> p3 = xx.g(0L, 1.0); |
| 73 | only<double> p4 = xx.get_nested<double>().h(0L, 1.0, 3.14f); |
| 74 | |
| 75 | namespace PR12053 { |
| 76 | template <typename T> |
| 77 | auto f1(T t) -> decltype(f1(t)) {} // expected-note{{candidate template ignored}} |
| 78 | |
| 79 | void test_f1() { |
| 80 | f1(0); // expected-error{{no matching function for call to 'f1'}} |
| 81 | } |
| 82 | |
| 83 | template <typename T> |
| 84 | auto f2(T t) -> decltype(f2(&t)) {} // expected-note{{candidate template ignored}} |
| 85 | |
| 86 | void test_f2() { |
| 87 | f2(0); // expected-error{{no matching function for call to 'f2'}} |
| 88 | } |
| 89 | } |
| 90 | |
| 91 | namespace DR1608 { |
| 92 | struct S { |
| 93 | void operator+(); |
| 94 | int operator[](int); |
| 95 | auto f() -> decltype(+*this); // expected-note {{here}} |
| 96 | auto f() -> decltype((*this)[0]); // expected-error {{cannot be overloaded}} |
| 97 | }; |
| 98 | } |
| 99 | |
| 100 | namespace PR16273 { |
| 101 | struct A { |
| 102 | template <int N> void f(); |
| 103 | auto g()->decltype(this->f<0>()); |
| 104 | }; |
| 105 | } |
| 106 | |
| 107 | |