A failed template deduction in template member of a template triggers an ICE with -std=c++17 due to what seems like a missing handling of invalid input. Replacing the gcc_unreachable() call that causes the ICE with a return statement indicating the deduction failure eliminates the ICE and restores sane diagnostics.
Martin
PR c++/84355 - [7/8 Regression] ICE with failing template argument deduction gcc/cp/ChangeLog: PR c++/84355 * pt.c (unify): Return failure instead of asserting. gcc/testsuite/ChangeLog: PR c++/84355 * g++.dg/cpp1z/class-deduction48.C: New test. Index: gcc/cp/pt.c =================================================================== --- gcc/cp/pt.c (revision 257713) +++ gcc/cp/pt.c (working copy) @@ -20918,7 +20918,7 @@ unify (tree tparms, tree targs, tree parm, tree ar && TREE_CODE (tparm) != TYPE_DECL) || (TREE_CODE (parm) == TEMPLATE_TEMPLATE_PARM && TREE_CODE (tparm) != TEMPLATE_DECL)) - gcc_unreachable (); + return unify_invalid (explain_p); if (TREE_CODE (parm) == BOUND_TEMPLATE_TEMPLATE_PARM) { Index: gcc/testsuite/g++.dg/cpp1z/class-deduction48.C =================================================================== --- gcc/testsuite/g++.dg/cpp1z/class-deduction48.C (nonexistent) +++ gcc/testsuite/g++.dg/cpp1z/class-deduction48.C (working copy) @@ -0,0 +1,20 @@ +// PR c++/84355 - ICE with failing template argument deduction +// { dg-do compile } +// { dg-options "-std=c++17" } + +template <typename T> +struct A +{ + template <int> + struct B + { + B (T); + }; + + A () { + B b (0); // { dg-error "deduction failed" } + // { dg-error "no matching function" "" { target *-*-* } .-1 } + } +}; + +A<int> a;