diff options
author | Marek Polacek <polacek@redhat.com> | 2020-02-21 12:58:04 -0500 |
---|---|---|
committer | Marek Polacek <polacek@redhat.com> | 2020-02-24 10:48:31 -0500 |
commit | cae5ff6036a21c9bbe521d615d88e283b80fe695 (patch) | |
tree | e0b5eb1f69f35f2c5d6d4dee1e71c45ed053ab9a | |
parent | 27bf39a8035445ffc71b551619d7c1a232498054 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/parser.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | 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 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; |