Just missing the usual SFINAE pattern here. This was fixed for GCC 10 as a drive-by in r277902.
gcc/cp/ChangeLog 2020-03-05 Jason Merrill <ja...@redhat.com> PR c++/90338 * pt.c (invalid_nontype_parm_type_p): Check complain for non-literal and mutable errors. --- gcc/cp/pt.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 43d9660ebda..4787747b6ff 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -25341,15 +25341,20 @@ invalid_nontype_parm_type_p (tree type, tsubst_flags_t complain) return true; if (!literal_type_p (type)) { - error ("%qT is not a valid type for a template non-type parameter " - "because it is not literal", type); - explain_non_literal_class (type); + if (complain & tf_error) + { + auto_diagnostic_group d; + error ("%qT is not a valid type for a template non-type parameter " + "because it is not literal", type); + explain_non_literal_class (type); + } return true; } if (cp_has_mutable_p (type)) { - error ("%qT is not a valid type for a template non-type parameter " - "because it has a mutable member", type); + if (complain & tf_error) + error ("%qT is not a valid type for a template non-type parameter " + "because it has a mutable member", type); return true; } /* FIXME check op<=> and strong structural equality once spaceship is -- 2.18.1