c++: Fix template parm ICE [PR 98297]
authorNathan Sidwell <nathan@acm.org>
Wed, 16 Dec 2020 19:49:41 +0000 (11:49 -0800)
committerNathan Sidwell <nathan@acm.org>
Wed, 16 Dec 2020 19:57:31 +0000 (11:57 -0800)
I think this is nonsense code, we seem to be naming an instantiation
of a template template parm.  But this fixes the ICE.  Perhaps we
should diagnose the issue earlier?

gcc/cp/
* parser.c (cp_parser_elaborated_type_specifier): Test
BOUND_TEMPLATE_TEMPLATE_PARM before checking for instantiation.
gcc/testsuite/
* g++.dg/template/pr98297.C: New.

gcc/cp/parser.c
gcc/testsuite/g++.dg/template/pr98297.C [new file with mode: 0644]

index 7ea8c28830ea11f3fdcfb6f5cc64213e296a77e7..3883339aa642488930fbd6a376adcd378a7bb19d 100644 (file)
@@ -19650,7 +19650,9 @@ cp_parser_elaborated_type_specifier (cp_parser* parser,
       if (TREE_CODE (type) == TYPENAME_TYPE)
        warning (OPT_Wattributes,
                 "attributes ignored on uninstantiated type");
-      else if (tag_type != enum_type && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
+      else if (tag_type != enum_type
+              && TREE_CODE (type) != BOUND_TEMPLATE_TEMPLATE_PARM
+              && CLASSTYPE_TEMPLATE_INSTANTIATION (type)
               && ! processing_explicit_instantiation)
        warning (OPT_Wattributes,
                 "attributes ignored on template instantiation");
diff --git a/gcc/testsuite/g++.dg/template/pr98297.C b/gcc/testsuite/g++.dg/template/pr98297.C
new file mode 100644 (file)
index 0000000..0dd63a5
--- /dev/null
@@ -0,0 +1,6 @@
+// PR 98297, ICE
+// { dg-do compile { target c++11 } }
+template <template <class> class a>
+struct [[b]]
+a <int>; // { dg-error "does not declare anything" }
+// { dg-warning "ignored" "" { target *-*-* } .-1 }