[gcc/devel/ranger] c++: Fix ICE with -Wmismatched-tags [PR93869]

Aldy Hernandez aldyh@gcc.gnu.org
Wed Jun 17 19:08:59 GMT 2020


https://gcc.gnu.org/g:cae5ff6036a21c9bbe521d615d88e283b80fe695

commit cae5ff6036a21c9bbe521d615d88e283b80fe695
Author: Marek Polacek <polacek@redhat.com>
Date:   Fri Feb 21 12:58:04 2020 -0500

    c++: Fix ICE with -Wmismatched-tags [PR93869]
    
    This is a crash in cp_parser_check_class_key:
      tree type_decl = TYPE_MAIN_DECL (type);
      tree name = DECL_NAME (type_decl); // HERE
    because TYPE_MAIN_DECL of type was null as it's not a class type.
    Instead of checking CLASS_TYPE_P we should simply check class_key
    a bit earlier (in this case it was typename_type).
    
    2020-02-24  Marek Polacek  <polacek@redhat.com>
    
            PR c++/93869 - ICE with -Wmismatched-tags.
            * parser.c (cp_parser_check_class_key): Check class_key earlier.
    
            * g++.dg/warn/Wmismatched-tags-2.C: New test.

Diff:
---
 gcc/cp/ChangeLog                               |  5 +++++
 gcc/cp/parser.c                                | 14 +++++++-------
 gcc/testsuite/ChangeLog                        |  5 +++++
 gcc/testsuite/g++.dg/warn/Wmismatched-tags-2.C |  6 ++++++
 4 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d441add49e1..cc0929aaefa 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-24  Marek Polacek  <polacek@redhat.com>
+
+	PR c++/93869 - ICE with -Wmismatched-tags.
+	* parser.c (cp_parser_check_class_key): Check class_key earlier.
+
 2020-02-24  Marek Polacek  <polacek@redhat.com>
 
 	PR c++/93712 - ICE with ill-formed array list-initialization.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 87ed2a3a648..01936e8f39a 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -30998,6 +30998,13 @@ cp_parser_check_class_key (cp_parser *parser, location_t key_loc,
   if (!warn_mismatched_tags && !warn_redundant_tags)
     return;
 
+  /* Only consider the true class-keys below and ignore typename_type,
+     etc. that are not C++ class-keys.  */
+  if (class_key != class_type
+      && class_key != record_type
+      && class_key != union_type)
+    return;
+
   tree type_decl = TYPE_MAIN_DECL (type);
   tree name = DECL_NAME (type_decl);
   /* Look up the NAME to see if it unambiguously refers to the TYPE
@@ -31006,13 +31013,6 @@ cp_parser_check_class_key (cp_parser *parser, location_t key_loc,
   tree decl = cp_parser_lookup_name_simple (parser, name, input_location);
   pop_deferring_access_checks ();
 
-  /* Only consider the true class-keys below and ignore typename_type,
-     etc. that are not C++ class-keys.  */
-  if (class_key != class_type
-      && class_key != record_type
-      && class_key != union_type)
-    return;
-
   /* The class-key is redundant for uses of the CLASS_TYPE that are
      neither definitions of it nor declarations, and for which name
      lookup returns just the type itself.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8c7ae6f3685..59cedcf7c9e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-02-24  Marek Polacek  <polacek@redhat.com>
+
+	PR c++/93869 - ICE with -Wmismatched-tags.
+	* g++.dg/warn/Wmismatched-tags-2.C: New test.
+
 2020-02-20  Mark Eggleston  <mark.eggleston@codethink.com>
 
 	PR fortran/93835
diff --git a/gcc/testsuite/g++.dg/warn/Wmismatched-tags-2.C b/gcc/testsuite/g++.dg/warn/Wmismatched-tags-2.C
new file mode 100644
index 00000000000..00193f02f61
--- /dev/null
+++ b/gcc/testsuite/g++.dg/warn/Wmismatched-tags-2.C
@@ -0,0 +1,6 @@
+// PR c++/93869 - ICE with -Wmismatched-tags.
+// { dg-do compile }
+// { dg-options "-Wmismatched-tags" }
+
+namespace N { typedef int T; }
+typename N::T x;


More information about the Gcc-cvs mailing list