https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101848
Bug ID: 101848 Summary: Template metaprogramming errors in v11.1 Product: gcc Version: 11.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: qwdkguneykiffmmuyd at uivvn dot net Target Milestone: --- Created attachment 51285 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=51285&action=edit Preprocessed file This program fails to compile with g++ 11.1.0 with the following template errors, but DOES compile and execute with clang++ 12.0.1 on the same hardware. It is reported here in case such behavior is not intended. As instructed, the preprocessed file is included but not the original CPP file, which was explicitly listed as not to include. +verbatim+ $ g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 11.1.0 (GCC) -verbatim- +verbatim+ $ g++ kirktemp.cpp kirktemp.cpp:60:12: error: explicit specialization in non-namespace scope ‘struct ValidSched<numdays>’ 60 | template<> struct daytriad<numdays-1> | ^ kirktemp.cpp:60:21: error: too few template-parameter-lists 60 | template<> struct daytriad<numdays-1> | ^~~~~~~~~~~~~~~~~~~ kirktemp.cpp: In instantiation of ‘struct ValidSched<1>::daytriad<0>’: kirktemp.cpp:52:82: recursively required from ‘struct ValidSched<34>::daytriad<0>’ kirktemp.cpp:52:82: required from ‘struct ValidSched<35>::daytriad<0>’ kirktemp.cpp:71:28: required from ‘static void ValidSched<numdays>::printschedule() [with int numdays = 35]’ kirktemp.cpp:83:19: required from here kirktemp.cpp:52:82: error: invalid use of incomplete type ‘struct ValidSched<0>::daytriad<0>’ 52 | typedef typename ValidSched<numdays-1>::template daytriad<day>::thisdaytriad thisdaytriad; | ^~~~~~~~~~~~ kirktemp.cpp:78:24: note: declaration of ‘struct ValidSched<0>::daytriad<0>’ 78 | template<int> struct daytriad; | ^~~~~~~~ -verbatim-