https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65498
Daniel Krügler <daniel.kruegler at googlemail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |daniel.kruegler@googlemail. | |com --- Comment #3 from Daniel Krügler <daniel.kruegler at googlemail dot com> --- Removing libraries dependencies leads to: //-------------- template <typename, typename> struct is_same { enum { value = false }; constexpr bool operator()() const noexcept { return value; } }; template <typename T> struct is_same<T, T> { enum { value = true }; constexpr bool operator()() const noexcept { return value; } }; template <bool, typename = void> struct enable_if { }; template <typename T> struct enable_if<true, T> { typedef T type; }; template <bool V, typename T = void> using enable_if_t = typename enable_if<V, T>::type; struct T; template <typename, typename = void> struct F { }; template <typename X> struct F<X, enable_if_t<is_same<X, T>{}()>> { template <typename MakeDependent> F(MakeDependent) { auto ICE_HERE = __func__; (void)ICE_HERE; // avoid -Wunused-variable } }; int main() { F<T>{1}; } //-------------- If we remove remove the enable_if_t alias we get to: //-------------- template <typename, typename> struct is_same { enum { value = false }; constexpr bool operator()() const noexcept { return value; } }; template <typename T> struct is_same<T, T> { enum { value = true }; constexpr bool operator()() const noexcept { return value; } }; template <bool, typename = void> struct enable_if { }; template <typename T> struct enable_if<true, T> { typedef T type; }; struct T; template <typename, typename = void> struct F { }; template <typename X> struct F<X, typename enable_if<is_same<X, T>{}()>::type> { template <typename MakeDependent> F(MakeDependent) { auto ICE_HERE = __func__; (void)ICE_HERE; // avoid -Wunused-variable } }; int main() { F<T>{1}; } //-------------- This still leads to an ICE, but with different diagnostics using GCC 5.0.0 20150320 (experimental): >>>>>>>>>>> nternal compiler error: Error reporting routines re-entered. 0x6fedc5 cxx_eval_call_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:1358 0x6f9beb cxx_eval_constant_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3021 0x6fc330 cxx_eval_outermost_constant_expr /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:3529 0x6283b0 convert_nontype_argument /home/heads/gcc/gcc-source/gcc/cp/pt.c:5843 0x6283b0 convert_template_argument /home/heads/gcc/gcc-source/gcc/cp/pt.c:6744 0x628f32 coerce_template_parms /home/heads/gcc/gcc-source/gcc/cp/pt.c:7171 0x629ea8 lookup_template_class_1 /home/heads/gcc/gcc-source/gcc/cp/pt.c:7780 0x629ea8 lookup_template_class(tree_node*, tree_node*, tree_node*, tree_node*, int, int) /home/heads/gcc/gcc-source/gcc/cp/pt.c:8096 0x62b12c tsubst_aggr_type /home/heads/gcc/gcc-source/gcc/cp/pt.c:10460 0x623ce9 tsubst(tree_node*, tree_node*, int, tree_node*) /home/heads/gcc/gcc-source/gcc/cp/pt.c:12418 0x655bd0 dump_template_bindings /home/heads/gcc/gcc-source/gcc/cp/error.c:369 0x655bd0 dump_substitution /home/heads/gcc/gcc-source/gcc/cp/error.c:1448 0x6570fe decl_as_string_translate(tree_node*, int) /home/heads/gcc/gcc-source/gcc/cp/error.c:2821 0x6c1f35 cxx_printable_name_internal /home/heads/gcc/gcc-source/gcc/cp/tree.c:2028 0x656cb2 cp_print_error_function /home/heads/gcc/gcc-source/gcc/cp/error.c:3154 0x656cb2 cp_diagnostic_starter /home/heads/gcc/gcc-source/gcc/cp/error.c:3108 0x102b889 diagnostic_report_diagnostic(diagnostic_context*, diagnostic_info*) /home/heads/gcc/gcc-source/gcc/diagnostic.c:866 0x102c8a2 internal_error(char const*, ...) /home/heads/gcc/gcc-source/gcc/diagnostic.c:1223 0x102b1e3 fancy_abort(char const*, int, char const*) /home/heads/gcc/gcc-source/gcc/diagnostic.c:1291 0x6fedc5 cxx_eval_call_expression /home/heads/gcc/gcc-source/gcc/cp/constexpr.c:1358 <<<<<<<<<<<