re PR c++/93138 (elaborated type specifier visibility check problem)

PR c++/93138
	* parser.c (cp_parser_check_class_key): Disable access checks for the
	simple name lookup.
	(cp_parser_maybe_warn_enum_key): Likewise.  Return early if
	!warn_redundant_tags.

	* g++.dg/warn/Wredundant-tags-2.C: New test.

From-SVN: r279886
This commit is contained in:
Jakub Jelinek 2020-01-05 13:50:40 +01:00 committed by Jakub Jelinek
parent 5205a4456b
commit 39bec8cd35
4 changed files with 38 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2020-01-05 Jakub Jelinek <jakub@redhat.com>
PR c++/93138
* parser.c (cp_parser_check_class_key): Disable access checks for the
simple name lookup.
(cp_parser_maybe_warn_enum_key): Likewise. Return early if
!warn_redundant_tags.
2010-01-05 Jakub Jelinek <jakub@redhat.com> 2010-01-05 Jakub Jelinek <jakub@redhat.com>
PR c++/93046 PR c++/93046

View File

@ -30663,11 +30663,15 @@ static void
cp_parser_maybe_warn_enum_key (cp_parser *parser, location_t key_loc, cp_parser_maybe_warn_enum_key (cp_parser *parser, location_t key_loc,
tree type, rid scoped_key) tree type, rid scoped_key)
{ {
if (!warn_redundant_tags)
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. */
and set KEY_REDUNDANT if so. */ push_deferring_access_checks (dk_no_check);
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 ();
/* The enum-key is redundant for uses of the TYPE that are not /* The enum-key is redundant for uses of the TYPE that are not
declarations and for which name lookup returns just the type declarations and for which name lookup returns just the type
@ -30837,7 +30841,9 @@ cp_parser_check_class_key (cp_parser *parser, location_t key_loc,
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
and set KEY_REDUNDANT if so. */ and set KEY_REDUNDANT if so. */
push_deferring_access_checks (dk_no_check);
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 ();
/* 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

View File

@ -1,4 +1,7 @@
2010-01-05 Jakub Jelinek <jakub@redhat.com> 2020-01-05 Jakub Jelinek <jakub@redhat.com>
PR c++/93138
* g++.dg/warn/Wredundant-tags-2.C: New test.
PR c++/93046 PR c++/93046
* g++.dg/ext/cond4.C: New test. * g++.dg/ext/cond4.C: New test.

View File

@ -0,0 +1,18 @@
// PR c++/93138
// { dg-do compile }
// { dg-options "-Wredundant-tags" }
struct Foo
{
enum Kind { a };
private:
Kind Kind;
};
enum Foo::Kind foo (); // { dg-bogus "is private within this context|redundant" }
struct Bar
{
struct Kind { int a; };
private:
Kind Kind;
};
struct Bar::Kind bar (); // { dg-bogus "is private within this context|redundant" }