https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79381
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |accepts-invalid Status|UNCONFIRMED |RESOLVED Resolution|--- |INVALID --- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> --- I think the program is valid and GCC is right to accept it. The constraint checking doesn't need to check that the entire instantiation of DeriveFrom<void(*)()> is valid, so doesn't check the base classes. It also compiles if DeriveFrom is incomplete: template<class> struct DeriveFrom; All the constraint checks is that DeriveFrom<T> is a type, which doesn't require it to be complete or able to be instantiated.