aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2020-02-21 12:58:04 -0500
committerMarek Polacek <polacek@redhat.com>2020-02-24 10:48:31 -0500
commitcae5ff6036a21c9bbe521d615d88e283b80fe695 (patch)
treee0b5eb1f69f35f2c5d6d4dee1e71c45ed053ab9a
parent27bf39a8035445ffc71b551619d7c1a232498054 (diff)
downloadgcc-cae5ff6036a21c9bbe521d615d88e283b80fe695.zip
gcc-cae5ff6036a21c9bbe521d615d88e283b80fe695.tar.gz
gcc-cae5ff6036a21c9bbe521d615d88e283b80fe695.tar.bz2
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.
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/parser.c14
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/Wmismatched-tags-2.C6
4 files changed, 23 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d441add..cc0929a 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,10 @@
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.
* call.c (next_conversion): Return NULL for ck_aggr.
(build_aggr_conv): Set u.expr instead of u.next.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 87ed2a3..01936e8 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 8c7ae6f..59cedcf 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 0000000..00193f0
--- /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;