https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79668
Bug ID: 79668 Summary: [c++1z] inconsistent handling of parameter matching in template template arguments Product: gcc Version: 7.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: richard-gccbugzilla at metafoo dot co.uk Target Milestone: --- Consider the following: template<template<short x> typename> struct A; template<typename T, template<T x> typename> struct B; template<int x> struct C; A<C> *ac; B<short, C> *bc; It should hopefully be clear that the type 'A<C>' is valid if and only if the type 'B<short, C>' is valid. However, under -std=c++1z, GCC accepts 'A<C>' but rejects 'B<short, C>': <source>:5:11: error: type/value mismatch at argument 2 in template parameter list for 'template<class T, template<T x> class<template-parameter-1-2> > struct B' B<short, C> *bc; ^ <source>:5:11: note: expected a template of type 'template<T x> class<template-parameter-1-2>', got 'template<int x> struct C' Compiler exited with result code 1 Note that the above error is also the one produced outside C++1z mode, so perhaps whatever special handling is engaged for P0522R0 is missed in the case where the template template parameter is dependent? FWIW, Clang's implementation of P0522R0 accepts both cases.