160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s 232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali// RUN: %clang_cc1 -std=c++1y -verify -fsyntax-only %s -fdelayed-template-parsing -DDELAYED_TEMPLATE_PARSING 360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto f(); // expected-note {{previous}} 560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint f(); // expected-error {{differ only in their return type}} 660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto &g(); 860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto g() -> auto &; 960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 1060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto h() -> auto *; 1160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto *h(); 1260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 1360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithstruct Conv1 { 1460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto(); // expected-note {{declared here}} 1560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} conv1; 1660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv1a = conv1; // expected-error {{function 'operator auto' with deduced return type cannot be used before it is defined}} 1760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith// expected-error@-1 {{no viable conversion}} 1860e141e1f87211ca831de6821003d80fe20a06f3Richard SmithConv1::operator auto() { return 123; } 1960e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv1b = conv1; 2060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv1c = conv1.operator auto(); 2160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv1d = conv1.operator int(); // expected-error {{no member named 'operator int'}} 2260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 2360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithstruct Conv2 { 2460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto() { return 0; } // expected-note 2{{previous}} 2560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto() { return 0.; } // expected-error {{cannot be redeclared}} expected-error {{redefinition of 'operator auto'}} 2660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith}; 2760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 2860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithstruct Conv3 { 2960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto() { int *p = nullptr; return p; } // expected-note {{candidate}} 3060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto*() { int *p = nullptr; return p; } // expected-note {{candidate}} 3160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} conv3; 3260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint *conv3a = conv3; // expected-error {{ambiguous}} 3360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint *conv3b = conv3.operator auto(); 3460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint *conv3c = conv3.operator auto*(); 3560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 3660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithtemplate<typename T> 3760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithstruct Conv4 { 3860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith operator auto() { return T(); } 3960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith}; 4060e141e1f87211ca831de6821003d80fe20a06f3Richard SmithConv4<int> conv4int; 4160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv4a = conv4int; 4260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint conv4b = conv4int.operator auto(); 4360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 4460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto a(); 4560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto a() { return 0; } 4660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing T = decltype(a()); 4760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing T = int; 4860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto a(); // expected-note {{previous}} 4960e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing T = decltype(a()); 5060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto *a(); // expected-error {{differ only in their return type}} 5160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 5260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto b(bool k) { 5360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (k) 5460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return "hello"; 5560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return "goodbye"; 5660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 5760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 5860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto *ptr_1() { 5960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return 100; // expected-error {{cannot deduce return type 'auto *' from returned value of type 'int'}} 6060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 6160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 6260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithconst auto &ref_1() { 6360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return 0; // expected-warning {{returning reference to local temporary}} 6460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 6560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 6660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto init_list() { 6760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return { 1, 2, 3 }; // expected-error {{cannot deduce return type from initializer list}} 6860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 6960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 7060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto fwd_decl(); // expected-note 2{{here}} 7160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 7260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint n = fwd_decl(); // expected-error {{function 'fwd_decl' with deduced return type cannot be used before it is defined}} 7360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithint k = sizeof(fwd_decl()); // expected-error {{used before it is defined}} 7460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 7560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto fac(int n) { 7660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (n <= 2) 7760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return n; 7860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return n * fac(n-1); // ok 7960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 8060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 8160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto fac_2(int n) { // expected-note {{declared here}} 8260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (n > 2) 8360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return n * fac_2(n-1); // expected-error {{cannot be used before it is defined}} 8460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return n; 8560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 8660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 8760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto void_ret() {} 8860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Void = void; 8960e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing Void = decltype(void_ret()); 9060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 9160e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto &void_ret_2() {} // expected-error {{cannot deduce return type 'auto &' for function with no return statements}} 9260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithconst auto void_ret_3() {} // ok, return type 'const void' is adjusted to 'void' 9360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 9460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithconst auto void_ret_4() { 9560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (false) 9660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return void(); 9760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (false) 9860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return; 9960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return 0; // expected-error {{'auto' in return type deduced as 'int' here but deduced as 'void' in earlier return statement}} 10060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 10160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 10260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace Templates { 10360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto f1() { 10460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return T() + 1; 10560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 10660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto &f2(T &&v) { return v; } 10760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int a = f1<int>(); 10860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith const int &b = f2(0); 10960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith double d; 11060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith float &c = f2(0.0); // expected-error {{non-const lvalue reference to type 'float' cannot bind to a value of unrelated type 'double'}} 11160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 11260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto fwd_decl(); // expected-note {{declared here}} 11360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int e = fwd_decl<int>(); // expected-error {{cannot be used before it is defined}} 11460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto fwd_decl() { return 0; } 11560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int f = fwd_decl<int>(); 1164384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo template <typename T> 1174384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo auto fwd_decl(); // expected-note {{candidate template ignored: could not match 'auto ()' against 'int ()'}} 11860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int g = fwd_decl<char>(); 11960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 12060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto (*p)() = f1; // expected-error {{incompatible initializer}} 12160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto (*q)() = f1<int>; // ok 12260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 12360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith typedef decltype(f2(1.2)) dbl; // expected-note {{previous}} 12460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith typedef float dbl; // expected-error {{typedef redefinition with different types ('float' vs 'decltype(f2(1.2))' (aka 'double &'))}} 12560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 12660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith extern template auto fwd_decl<double>(); 12760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int k1 = fwd_decl<double>(); 12860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith extern template int fwd_decl<char>(); // expected-error {{does not refer to a function template}} 12960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int k2 = fwd_decl<char>(); 13060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 1314384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo template <typename T> auto instantiate() { T::error; } // expected-error {{has no members}} \ 1324384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo // expected-note {{candidate template ignored: could not match 'auto ()' against 'void ()'}} 13360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith extern template auto instantiate<int>(); // ok 13460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int k = instantiate<int>(); // expected-note {{in instantiation of}} 13560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<> auto instantiate<char>() {} // ok 13660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<> void instantiate<double>() {} // expected-error {{no function template matches}} 13760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 13860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto arg_single() { return 0; } 13960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto arg_multi() { return 0l; } 14060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto arg_multi(int) { return "bad"; } 14160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> struct Outer { 14260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith static auto arg_single() { return 0.f; } 14360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith static auto arg_multi() { return 0.; } 14460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith static auto arg_multi(int) { return "bad"; } 14560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith }; 14660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> T &take_fn(T (*p)()); 14760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 14860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &check1 = take_fn(arg_single); // expected-error {{no matching}} expected-note@-2 {{couldn't infer}} 14960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &check2 = take_fn(arg_single<int>); 15060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &check3 = take_fn<int>(arg_single); // expected-error {{no matching}} expected-note@-4{{no overload of 'arg_single'}} 15160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &check4 = take_fn<int>(arg_single<int>); 15260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith long &check5 = take_fn(arg_multi); // expected-error {{no matching}} expected-note@-6 {{couldn't infer}} 15360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith long &check6 = take_fn(arg_multi<int>); 15460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith long &check7 = take_fn<long>(arg_multi); // expected-error {{no matching}} expected-note@-8{{no overload of 'arg_multi'}} 15560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith long &check8 = take_fn<long>(arg_multi<int>); 15660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 15760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith float &mem_check1 = take_fn(Outer<int>::arg_single); 15860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith float &mem_check2 = take_fn<float>(Outer<char>::arg_single); 15960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith double &mem_check3 = take_fn(Outer<long>::arg_multi); 16060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith double &mem_check4 = take_fn<double>(Outer<double>::arg_multi); 16160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 16260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith namespace Deduce1 { 16372a36a14b10c18bc72bf0472dc29e86327615c26Richard Smith template <typename T> auto f() { return 0; } // expected-note {{couldn't infer template argument 'T'}} 16460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> void g(T(*)()); // expected-note 2{{candidate}} 16560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void h() { 16660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto p = f<int>; 16760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto (*q)() = f<int>; 16860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (*r)() = f; // expected-error {{does not match}} 16960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f<int>); 17060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g<int>(f); // expected-error {{no matching function}} 17160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f); // expected-error {{no matching function}} 17260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 17360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 17460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 17560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith namespace Deduce2 { 17672a36a14b10c18bc72bf0472dc29e86327615c26Richard Smith template <typename T> auto f(int) { return 0; } // expected-note {{couldn't infer template argument 'T'}} 17760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> void g(T(*)(int)); // expected-note 2{{candidate}} 17860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void h() { 17960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto p = f<int>; 18060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto (*q)(int) = f<int>; 18160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (*r)(int) = f; // expected-error {{does not match}} 18260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f<int>); 18360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g<int>(f); // expected-error {{no matching function}} 18460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f); // expected-error {{no matching function}} 18560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 18660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 18760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 18860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith namespace Deduce3 { 18960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto f(T) { return 0; } 19060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> void g(T(*)(int)); // expected-note {{couldn't infer}} 19160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void h() { 19260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto p = f<int>; 19360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto (*q)(int) = f<int>; 19460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (*r)(int) = f; // ok 19560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f<int>); 19660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g<int>(f); // ok 19760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith g(f); // expected-error {{no matching function}} 19860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 19960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 20060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 20160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith namespace DeduceInDeducedReturnType { 20260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T, typename U> auto f() -> auto (T::*)(U) { 20360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (T::*result)(U) = nullptr; 20460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return result; 20560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 20660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct S {}; 20760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (S::*(*p)())(double) = f; 20860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (S::*(*q)())(double) = f<S, double>; 20960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 21060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 21160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 21260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto fwd_decl_using(); 21360e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace N { using ::fwd_decl_using; } 21460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto fwd_decl_using() { return 0; } 21560e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace N { int k = N::fwd_decl_using(); } 21660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 21760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace OverloadResolutionNonTemplate { 21860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); 21960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(int); // expected-note {{here}} 22060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 22160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &g(int (*f)()); // expected-note {{not viable: no overload of 'f' matching 'int (*)()'}} 22260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith char &g(int (*f)(int)); // expected-note {{not viable: no overload of 'f' matching 'int (*)(int)'}} 22360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 22460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int a = g(f); // expected-error {{no matching function}} 22560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 22660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f() { return 0; } 22760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 22860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith // FIXME: It's not completely clear whether this should be ill-formed. 22960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &b = g(f); // expected-error {{used before it is defined}} 23060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 23160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(int) { return 0.0; } 23260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 23360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &c = g(f); // ok 23460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 23560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 23660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace OverloadResolutionTemplate { 23760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); 23860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto f(T); 23960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 24060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &g(int (*f)()); // expected-note {{not viable: no overload of 'f' matching 'int (*)()'}} expected-note {{candidate}} 24160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith char &g(int (*f)(int)); // expected-note {{not viable: no overload of 'f' matching 'int (*)(int)'}} expected-note {{candidate}} 24260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 24360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int a = g(f); // expected-error {{no matching function}} 24460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 24560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f() { return 0; } 24660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 24760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &b = g(f); // ok (presumably), due to deduction failure forming type of 'f<int>' 24860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 24960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto f(T) { return 0; } 25060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 25160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int &c = g(f); // expected-error {{ambiguous}} 25260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 25360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 25460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace DefaultedMethods { 25560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct A { 25660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto operator=(const A&) = default; // expected-error {{must return 'DefaultedMethods::A &'}} 25760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith A &operator=(A&&); // expected-note {{previous}} 25860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith }; 2598ef1b372b4a13e79ac827b15635cd0fe08170189Richard Smith auto A::operator=(A&&) = default; // expected-error {{return type of out-of-line definition of 'DefaultedMethods::A::operator=' differs from that in the declaration}} 26060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 26160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 26260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace Constexpr { 26360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith constexpr auto f1(int n) { return n; } 2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> struct X { constexpr auto f() {} }; // PR18746 2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> struct Y { constexpr T f() {} }; // expected-note {{control reached end of constexpr function}} 2666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void f() { 2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines X<int>().f(); 2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Y<void>().f(); 2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines constexpr int q = Y<int>().f(); // expected-error {{must be initialized by a constant expression}} expected-note {{in call to '&Y<int>()->f()'}} 2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 27160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct NonLiteral { ~NonLiteral(); } nl; // expected-note {{user-provided destructor}} 27260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith constexpr auto f2(int n) { return nl; } // expected-error {{return type 'Constexpr::NonLiteral' is not a literal type}} 27360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 27460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 27560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith// It's not really clear whether these are valid, but this matches g++. 27660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithusing size_t = decltype(sizeof(0)); 27760e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto operator new(size_t n, const char*); // expected-error {{must return type 'void *'}} 27860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithauto operator delete(void *, const char*); // expected-error {{must return type 'void'}} 27960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 28060e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace Virtual { 28160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct S { 28260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith virtual auto f() { return 0; } // expected-error {{function with deduced return type cannot be virtual}} expected-note {{here}} 28360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith }; 28460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith // Allow 'auto' anyway for error recovery. 28560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct T : S { 28660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int f(); 28760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith }; 28860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct U : S { 28960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); // expected-error {{different return}} 29060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith }; 29160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 29260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith // And here's why... 29360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct V { virtual auto f(); }; // expected-error {{cannot be virtual}} 29460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith struct W : V { virtual auto f(); }; // expected-error {{cannot be virtual}} 29560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto V::f() { return 0; } // in tu1.cpp 29660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto W::f() { return 0.0; } // in tu2.cpp 29760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith W w; 29860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int k1 = w.f(); 29960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int k2 = ((V&)w).f(); 30060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 30160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 30260e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace std_examples { 30360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 30460e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace NoReturn { 30560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f() {} 30660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void (*p)() = &f; 30760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 30825d8c856681120581315edcdb48257c99af6b45cRichard Smith auto f(); // ok 30925d8c856681120581315edcdb48257c99af6b45cRichard Smith 31060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto *g() {} // expected-error {{cannot deduce return type 'auto *' for function with no return statements}} 31125d8c856681120581315edcdb48257c99af6b45cRichard Smith 31225d8c856681120581315edcdb48257c99af6b45cRichard Smith auto h() = delete; // expected-note {{explicitly deleted}} 31325d8c856681120581315edcdb48257c99af6b45cRichard Smith auto x = h(); // expected-error {{call to deleted}} 31460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 31560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 31660e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace UseBeforeComplete { 31760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto n = n; // expected-error {{variable 'n' declared with 'auto' type cannot appear in its own initializer}} 31860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); // expected-note {{declared here}} 31960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void g() { &f; } // expected-error {{function 'f' with deduced return type cannot be used before it is defined}} 32060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto sum(int i) { 32160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith if (i == 1) 32260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return i; 32360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith else 32460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith return sum(i - 1) + i; 32560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith } 32660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 32760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 32860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace Redecl { 32960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); 33060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f() { return 42; } 33160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith auto f(); // expected-note 2{{previous}} 33260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int f(); // expected-error {{functions that differ only in their return type cannot be overloaded}} 33360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith decltype(auto) f(); // expected-error {{cannot be overloaded}} 33460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 3354384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo template <typename T> auto g(T t) { return t; } // expected-note {{candidate}} \ 3364384712b3a0aedd7c68d6abdb0407850f7b46c8bLarisse Voufo // expected-note {{candidate function [with T = int]}} 33760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template auto g(int); 33860e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template char g(char); // expected-error {{does not refer to a function}} 33960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<> auto g(double); 34060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 34160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> T g(T t) { return t; } // expected-note {{candidate}} 34260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template char g(char); 34360e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template auto g(float); 34460e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 34560e141e1f87211ca831de6821003d80fe20a06f3Richard Smith void h() { return g(42); } // expected-error {{ambiguous}} 34660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 34760e141e1f87211ca831de6821003d80fe20a06f3Richard Smith 34860e141e1f87211ca831de6821003d80fe20a06f3Richard Smithnamespace ExplicitInstantiationDecl { 34960e141e1f87211ca831de6821003d80fe20a06f3Richard Smith template<typename T> auto f(T t) { return t; } 35060e141e1f87211ca831de6821003d80fe20a06f3Richard Smith extern template auto f(int); 35160e141e1f87211ca831de6821003d80fe20a06f3Richard Smith int (*p)(int) = f; 35260e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 353d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Valinamespace MemberTemplatesWithDeduction { 354d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali struct M { 355d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali template<class T> auto foo(T t) { return t; } 356d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali template<class T> auto operator()(T t) const { return t; } 357d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali template<class T> static __attribute__((unused)) int static_foo(T) { 358d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali return 5; 359d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali } 360d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali template<class T> operator T() { return T{}; } 361d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali operator auto() { return &static_foo<int>; } 362d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali }; 363d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali struct N : M { 364d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali using M::foo; 365d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali using M::operator(); 366d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali using M::static_foo; 367d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali using M::operator auto; 368d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali }; 369d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali 370d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali template <class T> int test() { 371d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int i = T{}.foo(3); 372d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali T m = T{}.foo(M{}); 373d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int j = T{}(3); 374d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali M m2 = M{}(M{}); 375d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int k = T{}.static_foo(4); 376d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int l = T::static_foo(5); 377d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int l2 = T{}; 378d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali struct X { }; 379d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali X x = T{}; 380d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali return 0; 381d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali } 382d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int Minst = test<M>(); 383d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali int Ninst = test<N>(); 384d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali 385d570a9282fd1793cbf21c090d80cb0b6b4b89982Faisal Vali} 38660e141e1f87211ca831de6821003d80fe20a06f3Richard Smith} 38737e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith 38837e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smithnamespace CurrentInstantiation { 38937e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith // PR16875 39037e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith template<typename T> struct S { 39137e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith auto f() { return T(); } 39237e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith int g() { return f(); } 39337e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith auto h(bool b) { 39437e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith if (b) 39537e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith return T(); 39637e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith return h(true); 39737e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith } 39837e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith }; 39937e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith int k1 = S<int>().g(); 40037e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith int k2 = S<int>().h(false); 40137e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith 40237e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith template<typename T> struct U { 40332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #ifndef DELAYED_TEMPLATE_PARSING 40437e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith auto f(); // expected-note {{here}} 40537e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith int g() { return f(); } // expected-error {{cannot be used before it is defined}} 40632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #else 40732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali auto f(); 40832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali int g() { return f(); } 40932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #endif 41037e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith }; 41132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #ifndef DELAYED_TEMPLATE_PARSING 41237e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith template int U<int>::g(); // expected-note {{in instantiation of}} 41332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #else 41432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali template int U<int>::g(); 41532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali #endif 41637e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith template<typename T> auto U<T>::f() { return T(); } 41737e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith template int U<short>::g(); // ok 41837e849ad80731ac1b2ad1c64e73bced27802bd8bRichard Smith} 4199d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer 4209d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemernamespace WithDefaultArgs { 4219d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer template<typename U> struct A { 4229d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer template<typename T = U> friend auto f(A) { return []{}; } 4239d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer }; 4249d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer template<typename T> void f(); 4259d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer using T = decltype(f(A<int>())); 4269d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer using T = decltype(f<int>(A<int>())); 4279d57b8dea3b139dc2e2976ffccef50c74ac03873David Majnemer} 42832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 42932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valinamespace MultilevelDeduction { 43032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 43132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto F() -> auto* { return (int*)0; } 43232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 43332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto (*G())() -> int* { return F; } 43432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 43532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto run = G(); 43632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 43732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valinamespace Templated { 43832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valitemplate<class T> 43932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto F(T t) -> auto* { return (T*)0; } 44032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 44132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valitemplate<class T> 44232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto (*G(T t))(T) -> T* { return &F<T>; } 44332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 44432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 44532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valitemplate<class T> 44632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto (*G2(T t))(T) -> auto* { return &F<T>; } 44732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 44832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto run_int = G(1); 44932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto run_char = G2('a'); 45032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 45132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali} 45232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali} 45332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 45432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valinamespace rnk { 45532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiextern "C" int puts(const char *s); 45632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valitemplate <typename T> 45732b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiauto foo(T x) -> decltype(x) { 45832b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali#ifdef DELAYED_TEMPLATE_PARSING 45932b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali ::rnk::bar(); 46032b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali#endif 46132b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali return x; 46232b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali} 46332b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valivoid bar() { puts("bar"); } 46432b5ca012c42d418c9ff0d4175b17f174459e187Faisal Valiint main() { return foo(0); } 46532b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali 46632b5ca012c42d418c9ff0d4175b17f174459e187Faisal Vali} 467f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith 468f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smithnamespace OverloadedOperators { 469f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith template<typename T> struct A { 470f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith auto operator()() { return T{}; } 471f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith auto operator[](int) { return T{}; } 472f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith auto operator+(int) { return T{}; } 473f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith auto operator+() { return T{}; } 474f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith friend auto operator-(A) { return T{}; } 475f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith friend auto operator-(A, A) { return T{}; } 476f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith }; 477f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith void f(A<int> a) { 478f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int b = a(); 479f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int c = a[0]; 480f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int d = a + 0; 481f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int e = +a; 482f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int f = -a; 483f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith int g = a - a; 484f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith } 485f93ec7608aa79f9aac09304bfd3bc1918caf128fRichard Smith} 486