diff options
author | dim <dim@FreeBSD.org> | 2013-12-22 00:07:40 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2013-12-22 00:07:40 +0000 |
commit | 952eddef9aff85b1e92626e89baaf7a360e2ac85 (patch) | |
tree | df8df0b0067b381eab470a3b8f28d14a552a6340 /test/CXX/temp/temp.spec | |
parent | ea266cad53e3d49771fa38103913d3ec7a166694 (diff) | |
download | FreeBSD-src-952eddef9aff85b1e92626e89baaf7a360e2ac85.zip FreeBSD-src-952eddef9aff85b1e92626e89baaf7a360e2ac85.tar.gz |
Vendor import of clang release_34 branch r197841 (effectively, 3.4 RC3):
https://llvm.org/svn/llvm-project/cfe/branches/release_34@197841
Diffstat (limited to 'test/CXX/temp/temp.spec')
-rw-r--r-- | test/CXX/temp/temp.spec/cxx1y-variable-template-no-body.cpp | 37 | ||||
-rw-r--r-- | test/CXX/temp/temp.spec/no-body.cpp | 63 | ||||
-rw-r--r-- | test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp | 2 | ||||
-rw-r--r-- | test/CXX/temp/temp.spec/temp.explicit/p9-linkage.cpp | 2 | ||||
-rw-r--r-- | test/CXX/temp/temp.spec/temp.inst/p1.cpp | 11 |
5 files changed, 107 insertions, 8 deletions
diff --git a/test/CXX/temp/temp.spec/cxx1y-variable-template-no-body.cpp b/test/CXX/temp/temp.spec/cxx1y-variable-template-no-body.cpp new file mode 100644 index 0000000..93f8ff1 --- /dev/null +++ b/test/CXX/temp/temp.spec/cxx1y-variable-template-no-body.cpp @@ -0,0 +1,37 @@ +// RUN: %clang_cc1 --std=c++1y -fsyntax-only -verify %s +// RUN: cp %s %t +// RUN: not %clang_cc1 --std=c++1y -x c++ -fixit %t -DFIXING +// RUN: %clang_cc1 --std=c++1y -x c++ %t -DFIXING + +template<typename T> +T pi = T(3.1415926535897932385); // expected-note {{template is declared here}} + +template int pi<int>; + +#ifndef FIXING +template float pi<>; // expected-error {{too few template arguments for template 'pi'}} +template double pi_var0; // expected-error {{explicit instantiation of 'pi_var0' does not refer to a function template, variable template, member function, member class, or static data member}} +#endif + +// Should recover as if definition +template double pi_var = 5; // expected-error {{variable cannot be defined in an explicit instantiation; if this declaration is meant to be a variable definition, remove the 'template' keyword}} +#ifndef FIXING +template<typename T> +T pi0 = T(3.1415926535897932385); // expected-note {{previous definition is here}} + +template int pi0 = 10; // expected-error {{variable cannot be defined in an explicit instantiation; if this declaration is meant to be a variable definition, remove the 'template' keyword}} \ + expected-error{{redefinition of 'pi0' as different kind of symbol}} +#endif + +template<typename T> +T pi1 = T(3.1415926535897932385); + +// Should recover as if specialization +template float pi1<float> = 1.0; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} +#ifndef FIXING +namespace expected_global { + template<> double pi1<double> = 1.5; // expected-error {{no variable template matches specialization}} + template int pi1<int> = 10; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} \ + expected-error {{no variable template matches specialization}} +} +#endif diff --git a/test/CXX/temp/temp.spec/no-body.cpp b/test/CXX/temp/temp.spec/no-body.cpp new file mode 100644 index 0000000..a4d7914 --- /dev/null +++ b/test/CXX/temp/temp.spec/no-body.cpp @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: cp %s %t +// RUN: not %clang_cc1 -x c++ -fixit %t -DFIXING +// RUN: %clang_cc1 -x c++ %t -DFIXING + +template<typename T> void f(T) { } +template<typename T> void g(T) { } +template<typename T> struct x { }; +template<typename T> struct y { }; // expected-note {{declared here}} + +namespace good { + template void f<int>(int); + template void g(int); + template struct x<int>; +} + +namespace unsupported { +#ifndef FIXING + template struct y; // expected-error {{elaborated type refers to a template}} +#endif +} + +template<typename T> void f0(T) { } +template<typename T> void g0(T) { } +template<typename T> struct x0 { }; // expected-note {{explicitly specialized declaration is here}} +template<typename T> struct y0 { }; + +// Should recover as if definition +namespace noargs_body { +#ifndef FIXING + template void g0(int) { } // expected-error {{function cannot be defined in an explicit instantiation; if this declaration is meant to be a function definition, remove the 'template' keyword}} +#endif + template struct y0 { }; // expected-error {{class cannot be defined in an explicit instantiation; if this declaration is meant to be a class definition, remove the 'template' keyword}} +} + +// Explicit specializations expected in global scope +namespace exp_spec { +#ifndef FIXING + template<> void f0<int>(int) { } // expected-error {{no function template matches function template specialization 'f0'}} + template<> struct x0<int> { }; // expected-error {{class template specialization of 'x0' must originally be declared in the global scope}} +#endif +} + +template<typename T> void f1(T) { } +template<typename T> struct x1 { }; // expected-note {{explicitly specialized declaration is here}} + +// Should recover as if specializations, +// thus also complain about not being in global scope. +namespace args_bad { +#ifndef FIXING + template void f1<int>(int) { } // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} \ + expected-error {{no function template matches function template specialization 'f1'}} + template struct x1<int> { }; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} \ + expected-error {{class template specialization of 'x1' must originally be declared in the global scope}} +#endif +} + +template<typename T> void f2(T) { } +template<typename T> struct x2 { }; + +// Should recover as if specializations +template void f2<int>(int) { } // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} +template struct x2<int> { }; // expected-error {{explicit template instantiation cannot have a definition; if this definition is meant to be an explicit specialization, add '<>' after the 'template' keyword}} diff --git a/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp b/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp index aecbfb5..d12feef 100644 --- a/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp +++ b/test/CXX/temp/temp.spec/temp.expl.spec/examples.cpp @@ -163,7 +163,7 @@ namespace PR9877 { template<> struct X<1>::Y { static const int Z = 1; }; const int X<0>::Y::Z; - template<> const int X<1>::Y::Z; // expected-error{{extraneous 'template<>' in declaration of variable 'Z'}} + template<> const int X<1>::Y::Z; // expected-error{{extraneous 'template<>' in declaration of variable 'Z'}} } namespace PR9913 { diff --git a/test/CXX/temp/temp.spec/temp.explicit/p9-linkage.cpp b/test/CXX/temp/temp.spec/temp.explicit/p9-linkage.cpp index ff24ad9..38dc367 100644 --- a/test/CXX/temp/temp.spec/temp.explicit/p9-linkage.cpp +++ b/test/CXX/temp/temp.spec/temp.explicit/p9-linkage.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -emit-llvm -std=c++11 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -disable-llvm-optzns -emit-llvm -std=c++11 -o - %s | FileCheck %s template<typename T> struct X0 { diff --git a/test/CXX/temp/temp.spec/temp.inst/p1.cpp b/test/CXX/temp/temp.spec/temp.inst/p1.cpp index 8684fc4..adf812b 100644 --- a/test/CXX/temp/temp.spec/temp.inst/p1.cpp +++ b/test/CXX/temp/temp.spec/temp.inst/p1.cpp @@ -33,24 +33,23 @@ namespace ScopedEnum { ScopedEnum1<double>::E e1; // ok ScopedEnum1<double>::E e2 = decltype(e2)::e; // expected-note {{in instantiation of enumeration 'ScopedEnum::ScopedEnum1<double>::E' requested here}} - // The behavior for enums defined within function templates is not clearly - // specified by the standard. We follow the rules for enums defined within - // class templates. + // DR1484 specifies that enumerations cannot be separately instantiated, + // they will be instantiated with the rest of the template declaration. template<typename T> int f() { enum class E { - e = T::error + e = T::error // expected-error {{has no members}} }; return (int)E(); } - int test1 = f<int>(); + int test1 = f<int>(); // expected-note {{here}} template<typename T> int g() { enum class E { e = T::error // expected-error {{has no members}} }; - return E::e; // expected-note {{here}} + return E::e; } int test2 = g<int>(); // expected-note {{here}} } |