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