http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51385
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-12-02 10:47:45 UTC --- Interestingly G++ is happy to not instantiate the template when it's not possible to, i.e. making this change and defining -DINCOMPLETE allows it to compile: template <typename T> struct FussyTemplate #ifndef INCOMPLETE { static_assert( test<T>::value, "not short" ); } #endif ; But if the class template definition is available it gets instantiated.