[clang] 70a926c - [clang] NFC: Add a few more interesting test cases for CWG2398
Matheus Izvekov via cfe-commits
cfe-commits at lists.llvm.org
Wed May 15 22:46:06 PDT 2024
Author: Matheus Izvekov
Date: 2024-05-16T02:45:50-03:00
New Revision: 70a926cfb1d4af326be5afe6419991aeff8f44b2
URL: https://github.com/llvm/llvm-project/commit/70a926cfb1d4af326be5afe6419991aeff8f44b2
DIFF: https://github.com/llvm/llvm-project/commit/70a926cfb1d4af326be5afe6419991aeff8f44b2.diff
LOG: [clang] NFC: Add a few more interesting test cases for CWG2398
Added:
Modified:
clang/test/SemaTemplate/cwg2398.cpp
Removed:
################################################################################
diff --git a/clang/test/SemaTemplate/cwg2398.cpp b/clang/test/SemaTemplate/cwg2398.cpp
index a20155486b123..d163354b2e5fe 100644
--- a/clang/test/SemaTemplate/cwg2398.cpp
+++ b/clang/test/SemaTemplate/cwg2398.cpp
@@ -137,3 +137,61 @@ namespace ttp_defaults {
// old-error at -2 {{template template argument has
diff erent template parameters}}
// old-error at -3 {{explicit instantiation of 'f' does not refer to a function template}}
} // namespace ttp_defaults
+
+namespace ttp_only {
+ template <template <class... > class TT1> struct A { static constexpr int V = 0; };
+ // new-note at -1 2{{template is declared here}}
+ template <template <class > class TT2> struct A<TT2> { static constexpr int V = 1; };
+ // new-error at -1 {{not more specialized than the primary template}}
+ // new-note at -2 {{partial specialization matches}}
+ template <template <class, class> class TT3> struct A<TT3> { static constexpr int V = 2; };
+ // new-error at -1 {{not more specialized than the primary template}}
+ // new-note at -2 {{partial specialization matches}}
+
+ template <class ... > struct B;
+ template <class > struct C;
+ template <class, class > struct D;
+ template <class, class, class> struct E;
+
+ static_assert(A<B>::V == 0); // new-error {{ambiguous partial specializations}}
+ static_assert(A<C>::V == 1);
+ static_assert(A<D>::V == 2);
+ static_assert(A<E>::V == 0);
+} // namespace ttp_only
+
+namespace consistency {
+ template<class T> struct nondeduced { using type = T; };
+ template<class T8, class T9 = float> struct B;
+
+ namespace t1 {
+ template<class T1, class T2, class T3> struct A;
+
+ template<template<class, class> class TT1,
+ class T1, class T2, class T3, class T4>
+ struct A<TT1<T1, T2>, TT1<T3, T4>, typename nondeduced<TT1<T1, T2>>::type> {};
+
+ template<template<class> class UU1,
+ template<class> class UU2,
+ class U1, class U2>
+ struct A<UU1<U1>, UU2<U2>, typename nondeduced<UU1<U1>>::type>;
+
+ template struct A<B<int>, B<int>, B<int>>;
+ } // namespace t1
+ namespace t2 {
+ template<class T1, class T2, class T3> struct A;
+
+ template<template<class, class> class TT1,
+ class T1, class T2, class T3, class T4>
+ struct A<TT1<T1, T2>, TT1<T3, T4>, typename nondeduced<TT1<T1, T4>>::type> {};
+ // new-note at -1 {{partial specialization matches}}
+
+ template<template<class> class UU1,
+ template<class> class UU2,
+ class U1, class U2>
+ struct A<UU1<U1>, UU2<U2>, typename nondeduced<UU1<U1>>::type>;
+ // new-note at -1 {{partial specialization matches}}
+
+ template struct A<B<int>, B<int>, B<int>>;
+ // new-error at -1 {{ambiguous partial specializations}}
+ } // namespace t1
+} // namespace consistency
More information about the cfe-commits
mailing list