Commit cae5ff60 by Marek Polacek

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.
parent 27bf39a8
2020-02-24 Marek Polacek <polacek@redhat.com> 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. PR c++/93712 - ICE with ill-formed array list-initialization.
* call.c (next_conversion): Return NULL for ck_aggr. * call.c (next_conversion): Return NULL for ck_aggr.
(build_aggr_conv): Set u.expr instead of u.next. (build_aggr_conv): Set u.expr instead of u.next.
......
...@@ -30998,6 +30998,13 @@ cp_parser_check_class_key (cp_parser *parser, location_t key_loc, ...@@ -30998,6 +30998,13 @@ cp_parser_check_class_key (cp_parser *parser, location_t key_loc,
if (!warn_mismatched_tags && !warn_redundant_tags) if (!warn_mismatched_tags && !warn_redundant_tags)
return; 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 type_decl = TYPE_MAIN_DECL (type);
tree name = DECL_NAME (type_decl); tree name = DECL_NAME (type_decl);
/* Look up the NAME to see if it unambiguously refers to the TYPE /* 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, ...@@ -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); tree decl = cp_parser_lookup_name_simple (parser, name, input_location);
pop_deferring_access_checks (); 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 /* The class-key is redundant for uses of the CLASS_TYPE that are
neither definitions of it nor declarations, and for which name neither definitions of it nor declarations, and for which name
lookup returns just the type itself. */ lookup returns just the type itself. */
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> 2020-02-20 Mark Eggleston <mark.eggleston@codethink.com>
PR fortran/93835 PR fortran/93835
......
// PR c++/93869 - ICE with -Wmismatched-tags.
// { dg-do compile }
// { dg-options "-Wmismatched-tags" }
namespace N { typedef int T; }
typename N::T x;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment