https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102305
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> --- On one side, some code could be relying on bug compatibility and so it would be undesirable to change it on release branches, on the other side the current behavior there is just weird, #include <type_traits> template <typename> struct AbstractTemplate { virtual ~AbstractTemplate() = 0; }; #ifdef D struct S : AbstractTemplate<int> {}; #endif bool a = std::is_default_constructible<AbstractTemplate<int> >::value; a is true if D is not defined and false if D is defined. And one can't really construct those abstract template classes...