Skip to content

Commit e090bac

Browse files
committed
[clang] NFC: add new cwg2398 tests
1 parent f7ccb32 commit e090bac

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

clang/test/SemaTemplate/cwg2398.cpp

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,120 @@ namespace consistency {
200200
template struct A<B<int>, B<int>, B<int>>;
201201
// new-error@-1 {{ambiguous partial specializations}}
202202
} // namespace t2
203+
namespace t3 {
204+
template<class T1, class T2, class T3> struct A;
205+
206+
template<template<class, class> class TT1,
207+
class T1, class T2, class T3, class T4>
208+
struct A<TT1<T1, T2>, TT1<T3, T4>, typename nondeduced<TT1<T1, T2>>::type> {};
209+
// new-note@-1 {{partial specialization matches}}
210+
211+
template<template<class> class UU1,
212+
class U1, class U2>
213+
struct A<UU1<U1>, UU1<U2>, typename nondeduced<UU1<U1>>::type>;
214+
// new-note@-1 {{partial specialization matches}}
215+
216+
template struct A<B<int>, B<int>, B<int>>;
217+
// new-error@-1 {{ambiguous partial specializations}}
218+
} // namespace t3
219+
namespace t4 {
220+
template<class T1, class T2, class T3> struct A;
221+
222+
template<template<class, class> class TT1,
223+
class T1, class T2, class T3, class T4>
224+
struct A<TT1<T1, T2>, TT1<T3, T4>, typename nondeduced<TT1<T1, T4>>::type> {};
225+
// new-note@-1 {{partial specialization matches}}
226+
227+
template<template<class> class UU1,
228+
class U1, class U2>
229+
struct A<UU1<U1>, UU1<U2>, typename nondeduced<UU1<U1>>::type>;
230+
// new-note@-1 {{partial specialization matches}}
231+
232+
template struct A<B<int>, B<int>, B<int>>;
233+
// new-error@-1 {{ambiguous partial specializations}}
234+
} // namespace t4
235+
namespace t5 {
236+
template<class T1, class T2> struct A;
237+
238+
template<template<class, class> class TT1,
239+
class T1, class T2, class T3, class T4>
240+
struct A<TT1<T1, T2>, TT1<T3, T4>> {};
241+
// new-note@-1 {{partial specialization matches}}
242+
243+
template<template<class> class UU1,
244+
class U1, class U2>
245+
struct A<UU1<U1>, UU1<U2>>;
246+
// new-note@-1 {{partial specialization matches}}
247+
248+
template struct A<B<int>, B<int>>;
249+
// new-error@-1 {{ambiguous partial specializations}}
250+
} // namespace t5
251+
namespace t6 {
252+
template<class T1, class T2> struct A;
253+
254+
template<template<class, class> class TT1,
255+
class T1, class T2, class T3>
256+
struct A<TT1<T1, T2>, TT1<T1, T3>> {};
257+
// new-note@-1 {{partial specialization matches}}
258+
259+
template<template<class> class UU1,
260+
class U1, class U2>
261+
struct A<UU1<U1>, UU1<U2>>;
262+
// new-note@-1 {{partial specialization matches}}
263+
264+
template struct A<B<int>, B<int>>;
265+
// new-error@-1 {{ambiguous partial specializations}}
266+
} // namespace t6
203267
} // namespace consistency
204268

269+
namespace classes {
270+
namespace canon {
271+
template<class T, class U> struct A {};
272+
273+
template<template<class> class TT> auto f(TT<int> a) { return a; }
274+
// old-note@-1 2{{template template argument has different template parameters}}
275+
// new-note@-2 2{{substitution failure: too few template arguments}}
276+
277+
A<int, float> v1;
278+
A<int, double> v2;
279+
280+
using X = decltype(f(v1));
281+
// expected-error@-1 {{no matching function for call}}
282+
283+
using X = decltype(f(v2));
284+
// expected-error@-1 {{no matching function for call}}
285+
} // namespace canon
286+
namespace expr {
287+
template <class T1, int E1> struct A {
288+
static constexpr auto val = E1;
289+
};
290+
template <template <class T3> class TT> void f(TT<int> v) {
291+
// old-note@-1 {{template template argument has different template parameters}}
292+
// new-note@-2 {{substitution failure: too few template arguments}}
293+
static_assert(v.val == 3);
294+
};
295+
void test() {
296+
f(A<int, 3>());
297+
// expected-error@-1 {{no matching function for call}}
298+
}
299+
} // namespace expr
300+
namespace packs {
301+
template <class T1, class ...T2s> struct A {
302+
static constexpr auto val = sizeof...(T2s);
303+
};
304+
305+
template <template <class T3> class TT> void f(TT<int> v) {
306+
// old-note@-1 {{template template argument has different template parameters}}
307+
// new-note@-2 {{deduced type 'A<[...], (no argument), (no argument), (no argument)>' of 1st parameter does not match adjusted type 'A<[...], void, void, void>' of argument [with TT = A]}}
308+
static_assert(v.val == 3);
309+
};
310+
void test() {
311+
f(A<int, void, void, void>());
312+
// expected-error@-1 {{no matching function for call}}
313+
}
314+
} // namespace packs
315+
} // namespace classes
316+
205317
namespace regression1 {
206318
template <typename T, typename Y> struct map {};
207319
template <typename T> class foo {};

0 commit comments

Comments
 (0)