blob: c219b77d9e4d520b6fd36d12f3bb7b505884ad8a [file] [log] [blame]
Richard Smith762bb9d2011-10-13 22:29:44 +00001// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
Douglas Gregordab60ad2010-10-01 18:44:50 +00002
3template <class T>
4struct only
5{
6 only(T) {}
7
8 template <class U>
9 only(U)
10 {
11 static_assert(sizeof(U) == 0, "expected type failure");
12 }
13};
14
15auto f() -> int
16{
17 return 0;
18}
19
20auto g(); // expected-error{{return without trailing return type}}
21
Richard Smith34b41d92011-02-20 03:19:35 +000022int h() -> int; // expected-error{{trailing return type must specify return type 'auto', not 'int'}}
Douglas Gregordab60ad2010-10-01 18:44:50 +000023
Richard Smitheefb3d52012-02-10 09:58:53 +000024int i();
25auto i() -> int;
26int i() {}
27
28using T = auto (int) -> auto (*)(char) -> void; // expected-note {{previous}}
29using T = void; // expected-error {{type alias redefinition with different types ('void' vs 'auto (int) -> auto (*)(char) -> void')}}
30
31using U = auto (int) -> auto (*)(char) -> void;
32using U = void (*(int))(char); // ok
33
Douglas Gregordab60ad2010-10-01 18:44:50 +000034int x;
35
36template <class T>
37auto i(T x) -> decltype(x)
38{
39 return x;
40}
41
42only<double> p1 = i(1.0);
43
44template <class T>
45struct X
46{
47 auto f(T x) -> T { return x; }
48
49 template <class U>
50 auto g(T x, U y) -> decltype(x + y)
51 {
52 return x + y;
53 }
54
55 template<typename U>
56 struct nested {
57 template <class V>
58 auto h(T x, U y, V z) -> decltype(x + y + z)
59 {
60 return x + y + z;
61 }
62 };
63
64 template<typename U>
65 nested<U> get_nested();
66};
67
68X<int> xx;
69only<int> p2 = xx.f(0L);
70only<double> p3 = xx.g(0L, 1.0);
71only<double> p4 = xx.get_nested<double>().h(0L, 1.0, 3.14f);