diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-22 16:52:41 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-22 16:52:41 +0000 |
commit | 5df539a1004bc4db5c38b33ba3e219595a10ae3c (patch) | |
tree | 8f7162c2eeb96f9bef560b568c3a039187a31953 /test/SemaTemplate | |
parent | d2e0a8dd949ab874c6d66f97106bd5c270e2fa7d (diff) |
Notes
Diffstat (limited to 'test/SemaTemplate')
-rw-r--r-- | test/SemaTemplate/class-template-spec.cpp | 12 | ||||
-rw-r--r-- | test/SemaTemplate/cxx1z-using-declaration.cpp | 6 | ||||
-rw-r--r-- | test/SemaTemplate/partial-order.cpp | 14 | ||||
-rw-r--r-- | test/SemaTemplate/temp_arg_nontype.cpp | 16 | ||||
-rw-r--r-- | test/SemaTemplate/temp_arg_template_cxx1z.cpp | 8 |
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; } |