1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 3dab60ad68a3a98d687305941a3852e793705f945Douglas Gregortemplate <class T> 4dab60ad68a3a98d687305941a3852e793705f945Douglas Gregorstruct only 5dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor{ 6dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor only(T) {} 7dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 8dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor template <class U> 9dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor only(U) 10dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor { 11dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor static_assert(sizeof(U) == 0, "expected type failure"); 12dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 13dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor}; 14dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 15dab60ad68a3a98d687305941a3852e793705f945Douglas Gregorauto f() -> int 16dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor{ 17dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return 0; 18dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor} 19dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesauto g(); // expected-error{{return without trailing return type; deduced return types are a C++14 extension}} 21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesdecltype(auto) g2(); // expected-warning{{extension}} expected-error-re{{{{^}}deduced return types are a C++14 extension}} 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto badness = g2(); 23dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 2434b41d939a1328f484511c6002ba2456db879a29Richard Smithint h() -> int; // expected-error{{trailing return type must specify return type 'auto', not 'int'}} 25dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 26eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithint i(); 27eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithauto i() -> int; 28eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithint i() {} 29eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith 30eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithusing T = auto (int) -> auto (*)(char) -> void; // expected-note {{previous}} 31eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithusing T = void; // expected-error {{type alias redefinition with different types ('void' vs 'auto (int) -> auto (*)(char) -> void')}} 32eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith 33eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithusing U = auto (int) -> auto (*)(char) -> void; 34eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smithusing U = void (*(int))(char); // ok 35eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith 36dab60ad68a3a98d687305941a3852e793705f945Douglas Gregorint x; 37dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 38dab60ad68a3a98d687305941a3852e793705f945Douglas Gregortemplate <class T> 39dab60ad68a3a98d687305941a3852e793705f945Douglas Gregorauto i(T x) -> decltype(x) 40dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor{ 41dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return x; 42dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor} 43dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 44dab60ad68a3a98d687305941a3852e793705f945Douglas Gregoronly<double> p1 = i(1.0); 45dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 46dab60ad68a3a98d687305941a3852e793705f945Douglas Gregortemplate <class T> 47dab60ad68a3a98d687305941a3852e793705f945Douglas Gregorstruct X 48dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor{ 49dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor auto f(T x) -> T { return x; } 50dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 51dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor template <class U> 52dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor auto g(T x, U y) -> decltype(x + y) 53dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor { 54dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return x + y; 55dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 56dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 57dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor template<typename U> 58dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor struct nested { 59dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor template <class V> 60dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor auto h(T x, U y, V z) -> decltype(x + y + z) 61dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor { 62dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor return x + y + z; 63dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor } 64dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor }; 65dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 66dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor template<typename U> 67dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor nested<U> get_nested(); 68dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor}; 69dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor 70dab60ad68a3a98d687305941a3852e793705f945Douglas GregorX<int> xx; 71dab60ad68a3a98d687305941a3852e793705f945Douglas Gregoronly<int> p2 = xx.f(0L); 72dab60ad68a3a98d687305941a3852e793705f945Douglas Gregoronly<double> p3 = xx.g(0L, 1.0); 73dab60ad68a3a98d687305941a3852e793705f945Douglas Gregoronly<double> p4 = xx.get_nested<double>().h(0L, 1.0, 3.14f); 74e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith 75e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smithnamespace PR12053 { 76e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith template <typename T> 77e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith auto f1(T t) -> decltype(f1(t)) {} // expected-note{{candidate template ignored}} 78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 79e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith void test_f1() { 80e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith f1(0); // expected-error{{no matching function for call to 'f1'}} 81e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith } 82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 83e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith template <typename T> 84e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith auto f2(T t) -> decltype(f2(&t)) {} // expected-note{{candidate template ignored}} 85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 86e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith void test_f2() { 87e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith f2(0); // expected-error{{no matching function for call to 'f2'}} 88e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith } 89e49ff3ef3459e97fa76502bd9eae4ed9170fd048Richard Smith} 90e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith 91e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smithnamespace DR1608 { 92e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith struct S { 93e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith void operator+(); 94e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith int operator[](int); 95e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith auto f() -> decltype(+*this); // expected-note {{here}} 96e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith auto f() -> decltype((*this)[0]); // expected-error {{cannot be overloaded}} 97e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith }; 98e410be9f3f08684c04a611f2ab57257c2d2eb0aeRichard Smith} 9933f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith 10033f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smithnamespace PR16273 { 10133f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith struct A { 10233f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith template <int N> void f(); 10333f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith auto g()->decltype(this->f<0>()); 10433f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith }; 10533f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith} 10633f0faa082b1aa5b52ae50f2ccaffc34629e01daRichard Smith 107