1 // CWG 150: Matching of template template-arguments excludes compatible
2 // templates
3 // { dg-options -fnew-ttp-matching }
4 
5 template<class T> class A { /* ... */ };
6 template<class T, class U = T> class B { /* ... */ };
7 template<template<class> class P> class X { /* ... */ };
8 X<A> xa; // OK
9 X<B> xb; // OK since P0522R0
10 
11 #if __cpp_variadic_templates
12 template <class ... Types> class C { /* ... */ };
13 template<template<class ...> class Q> class Y { /* ... */ };
14 X<C> xc; // OK since P0522R0
15 Y<A> ya; // OK
16 Y<B> yb; // OK
17 Y<C> yc; // OK
18 #endif
19 
20 #if __cpp_template_auto
21 template<auto n> class D { /* ... */ };
22 template<template<int> class R> class Z { /* ... */ };
23 Z<D> zd; // OK
24 #endif
25