https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111647
--- Comment #1 from Sergei Trofimovich <slyfox at gcc dot gnu.org> --- More realistic example extracted from gcc's poly_int: // $ cat rtl-tests.cc template<unsigned int N> struct poly_int { template<typename ...Cs> constexpr poly_int (const Cs &... cs) : coeffs { cs... } {} int coeffs[N]; }; #define TARGET_DEFINED_VALUE 1 // this works: //#define TARGET_DEFINED_VALUE 2 // Is instantiated only for N == 2. template<unsigned int N> struct const_poly_int_tests { static void run () { poly_int<TARGET_DEFINED_VALUE> (1, 1); } }; $ g++ -c rtl-tests.cc -fchecking=1 # did not fail, BAD! $ g++ -c rtl-tests.cc -fchecking=2 rtl-tests.cc: In instantiation of 'constexpr poly_int<N>::poly_int(const Cs& ...) [with Cs = {int, int}; unsigned int N = 1]': rtl-tests.cc:15:42: required from here rtl-tests.cc:3:5: error: too many initializers for 'int [1]' 3 | : coeffs { cs... } {} | ^~~~~~~~~~~~~~~~ # failed, GOOD $ clang++ -c rtl-tests.cc rtl-tests.cc:3:14: error: excess elements in array initializer : coeffs { cs... } {} ^~ rtl-tests.cc:15:5: note: in instantiation of function template specialization 'poly_int<1>::poly_int<int, int>' requested here poly_int<TARGET_DEFINED_VALUE> (1, 1); ^ 1 error generated. # failed, GOOD