summaryrefslogtreecommitdiff
path: root/test/SemaTemplate
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-01-22 16:52:41 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-01-22 16:52:41 +0000
commit5df539a1004bc4db5c38b33ba3e219595a10ae3c (patch)
tree8f7162c2eeb96f9bef560b568c3a039187a31953 /test/SemaTemplate
parentd2e0a8dd949ab874c6d66f97106bd5c270e2fa7d (diff)
Notes
Diffstat (limited to 'test/SemaTemplate')
-rw-r--r--test/SemaTemplate/class-template-spec.cpp12
-rw-r--r--test/SemaTemplate/cxx1z-using-declaration.cpp6
-rw-r--r--test/SemaTemplate/partial-order.cpp14
-rw-r--r--test/SemaTemplate/temp_arg_nontype.cpp16
-rw-r--r--test/SemaTemplate/temp_arg_template_cxx1z.cpp8
5 files changed, 35 insertions, 21 deletions
diff --git a/test/SemaTemplate/class-template-spec.cpp b/test/SemaTemplate/class-template-spec.cpp
index 518ec78e6f7d0..00e03ef61eb07 100644
--- a/test/SemaTemplate/class-template-spec.cpp
+++ b/test/SemaTemplate/class-template-spec.cpp
@@ -207,19 +207,19 @@ namespace NTTPTypeVsPartialOrder {
struct X { typedef int value_type; };
template<typename T> struct Y { typedef T value_type; };
- template<typename T, typename T::value_type N> struct A; // expected-note {{template}}
+ template<typename T, typename T::value_type N> struct A;
template<int N> struct A<X, N> {};
- template<typename T, T N> struct A<Y<T>, N> {}; // expected-error {{not more specialized}} expected-note {{'T' vs 'typename Y<type-parameter-0-0>::value_type'}}
+ template<typename T, T N> struct A<Y<T>, N> {};
A<X, 0> ax;
A<Y<int>, 0> ay;
- template<int, typename T, typename T::value_type> struct B; // expected-note {{template}}
- template<typename T, typename T::value_type N> struct B<0, T, N>; // expected-note {{matches}}
+ template<int, typename T, typename T::value_type> struct B;
+ template<typename T, typename T::value_type N> struct B<0, T, N>;
template<int N> struct B<0, X, N> {};
- template<typename T, T N> struct B<0, Y<T>, N> {}; // expected-error {{not more specialized}} expected-note {{'T' vs 'typename Y<type-parameter-0-0>::value_type'}} expected-note {{matches}}
+ template<typename T, T N> struct B<0, Y<T>, N> {};
B<0, X, 0> bx;
- B<0, Y<int>, 0> by; // expected-error {{ambiguous}}
+ B<0, Y<int>, 0> by;
}
namespace DefaultArgVsPartialSpec {
diff --git a/test/SemaTemplate/cxx1z-using-declaration.cpp b/test/SemaTemplate/cxx1z-using-declaration.cpp
index 7bef36db1f47a..87ca748f8fd58 100644
--- a/test/SemaTemplate/cxx1z-using-declaration.cpp
+++ b/test/SemaTemplate/cxx1z-using-declaration.cpp
@@ -17,7 +17,7 @@ void test_Unexpanded() {
// Test using non-type members from pack of base classes.
template<typename ...T> struct A : T... { // expected-note 2{{candidate}}
- using T::T ...; // expected-note 6{{inherited here}}
+ using T::T ...; // expected-note 2{{inherited here}}
using T::operator() ...;
using T::operator T* ...;
using T::h ...;
@@ -29,7 +29,7 @@ template<typename ...T> struct A : T... { // expected-note 2{{candidate}}
};
namespace test_A {
- struct X { // expected-note 2{{candidate}}
+ struct X {
X();
X(int); // expected-note {{candidate}}
void operator()(int); // expected-note 2{{candidate}}
@@ -43,7 +43,7 @@ namespace test_A {
operator Y *();
void h(int, int); // expected-note {{not viable}}
};
- struct Z { // expected-note 2{{candidate}}
+ struct Z {
Z();
Z(int); // expected-note {{candidate}}
void operator()(int); // expected-note 2{{candidate}}
diff --git a/test/SemaTemplate/partial-order.cpp b/test/SemaTemplate/partial-order.cpp
new file mode 100644
index 0000000000000..0a151de390236
--- /dev/null
+++ b/test/SemaTemplate/partial-order.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -std=c++1z %s -verify
+
+// expected-no-diagnostics
+
+namespace hana_enable_if_idiom {
+ template<bool> struct A {};
+ template<typename, typename = A<true>> struct B;
+ template<typename T, bool N> struct B<T, A<N>> {};
+ template<typename T> struct B<T, A<T::value>> {};
+ struct C {
+ static const bool value = true;
+ };
+ B<C> b;
+}
diff --git a/test/SemaTemplate/temp_arg_nontype.cpp b/test/SemaTemplate/temp_arg_nontype.cpp
index 27a0a03f84f46..5b72b8c6549a4 100644
--- a/test/SemaTemplate/temp_arg_nontype.cpp
+++ b/test/SemaTemplate/temp_arg_nontype.cpp
@@ -370,13 +370,13 @@ namespace PR17696 {
}
namespace partial_order_different_types {
- // These are unordered because the type of the final argument doesn't match.
- template<int, int, typename T, typename, T> struct A; // expected-note {{here}}
- template<int N, typename T, typename U, T V> struct A<0, N, T, U, V> {}; // expected-note {{matches}}
- template<typename T, typename U, U V> struct A<0, 0, T, U, V> {}; // expected-note {{matches}}
- // expected-error@-1 {{not more specialized than the primary}}
- // expected-note@-2 {{deduced non-type template argument does not have the same type as the corresponding template parameter ('U' vs 'type-parameter-0-0')}}
- A<0, 0, int, int, 0> a; // expected-error {{ambiguous partial specializations}}
+ template<int, int, typename T, typename, T> struct A;
+ template<int N, typename T, typename U, T V> struct A<0, N, T, U, V>; // expected-note {{matches}}
+ // FIXME: It appears that this partial specialization should be ill-formed as
+ // it is not more specialized than the primary template. V is not deducible
+ // because it does not have the same type as the corresponding parameter.
+ template<int N, typename T, typename U, U V> struct A<0, N, T, U, V> {}; // expected-note {{matches}}
+ A<0, 0, int, int, 0> a; // expected-error {{ambiguous}}
}
namespace partial_order_references {
@@ -434,7 +434,7 @@ namespace dependent_nested_partial_specialization {
template<typename T> struct E {
template<typename U, U V> struct F; // expected-note {{template}}
- template<typename W, T V> struct F<W, V> {}; // expected-error {{not more specialized than the primary}} expected-note {{does not have the same type}}
+ template<typename W, T V> struct F<W, V> {}; // expected-error {{not more specialized than the primary}}
};
E<int>::F<int, 0> e1; // expected-note {{instantiation of}}
}
diff --git a/test/SemaTemplate/temp_arg_template_cxx1z.cpp b/test/SemaTemplate/temp_arg_template_cxx1z.cpp
index aa517c3285993..703935dcd5c19 100644
--- a/test/SemaTemplate/temp_arg_template_cxx1z.cpp
+++ b/test/SemaTemplate/temp_arg_template_cxx1z.cpp
@@ -79,13 +79,13 @@ namespace Auto {
TInt<Auto> ia;
TInt<AutoPtr> iap; // expected-error {{different template parameters}}
- TInt<DecltypeAuto> ida; // FIXME expected-error {{different template parameters}}
+ TInt<DecltypeAuto> ida;
TInt<Int> ii;
TInt<IntPtr> iip; // expected-error {{different template parameters}}
TIntPtr<Auto> ipa;
TIntPtr<AutoPtr> ipap;
- TIntPtr<DecltypeAuto> ipda; // FIXME expected-error {{different template parameters}}
+ TIntPtr<DecltypeAuto> ipda;
TIntPtr<Int> ipi; // expected-error {{different template parameters}}
TIntPtr<IntPtr> ipip;
@@ -114,6 +114,6 @@ namespace Auto {
int n;
template<auto A, decltype(A) B = &n> struct SubstFailure;
- TInt<SubstFailure> isf; // expected-error {{different template parameters}}
- TIntPtr<SubstFailure> ipsf; // expected-error {{different template parameters}}
+ TInt<SubstFailure> isf; // FIXME: this should be ill-formed
+ TIntPtr<SubstFailure> ipsf;
}