diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2015-01-18 16:23:48 +0000 |
commit | 06d4ba388873e6d1cfa9cd715a8935ecc8cd2097 (patch) | |
tree | 3eb853da77d46cc77c4b017525a422f9ddb1385b /test/Parser/cxx11-templates.cpp | |
parent | 30d791273d07fac9c0c1641a0731191bca6e8606 (diff) | |
download | src-06d4ba388873e6d1cfa9cd715a8935ecc8cd2097.tar.gz src-06d4ba388873e6d1cfa9cd715a8935ecc8cd2097.zip |
Notes
Diffstat (limited to 'test/Parser/cxx11-templates.cpp')
-rw-r--r-- | test/Parser/cxx11-templates.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/Parser/cxx11-templates.cpp b/test/Parser/cxx11-templates.cpp new file mode 100644 index 000000000000..ed0495281c17 --- /dev/null +++ b/test/Parser/cxx11-templates.cpp @@ -0,0 +1,46 @@ +// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s + +struct S { + template <typename Ty = char> + static_assert(sizeof(Ty) != 1, "Not a char"); // expected-error {{a static_assert declaration cannot be a template}} +}; + +template <typename Ty = char> +static_assert(sizeof(Ty) != 1, "Not a char"); // expected-error {{a static_assert declaration cannot be a template}} + +namespace Ellipsis { + template<typename ...T> void f(T t..., int n); // expected-error {{must immediately precede declared identifier}} + template<typename ...T> void f(int n, T t...); // expected-error {{must immediately precede declared identifier}} + template<typename ...T> void f(int n, T t, ...); // expected-error {{unexpanded parameter pack}} + template<typename ...T> void f() { + f([]{ + void g(T + t // expected-note {{place '...' immediately before declared identifier to declare a function parameter pack}} + ... // expected-warning {{'...' in this location creates a C-style varargs function, not a function parameter pack}} + // expected-note@-1 {{insert ',' before '...' to silence this warning}} + ); + void h(T (& + ) // expected-note {{place '...' here to declare a function parameter pack}} + ... // expected-warning {{'...' in this location creates a C-style varargs function, not a function parameter pack}} + // expected-note@-1 {{insert ',' before '...' to silence this warning}} + ); + void i(T (&), ...); + }...); + } + template<typename ...T> struct S { + void f(T t...); // expected-error {{must immediately precede declared identifier}} + void f(T ... // expected-note {{preceding '...' declares a function parameter pack}} + t...); // expected-warning-re {{'...' in this location creates a C-style varargs function{{$}}}} + // expected-note@-1 {{insert ',' before '...' to silence this warning}} + }; + + // FIXME: We should just issue a single error in this case pointing out where + // the '...' goes. It's tricky to recover correctly in this case, though, + // because the parameter is in scope in the default argument, so must be + // passed to Sema before we reach the ellipsis. + template<typename...T> void f(T n = 1 ...); + // expected-warning@-1 {{creates a C-style varargs}} + // expected-note@-2 {{place '...' immediately before declared identifier}} + // expected-note@-3 {{insert ','}} + // expected-error@-4 {{unexpanded parameter pack}} +} |