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