From 96cbc56ed96490c58a9800f3e7507758b6602777 Mon Sep 17 00:00:00 2001 From: Martin Sebor Date: Thu, 20 Feb 2020 14:31:38 -0700 Subject: [PATCH] PR c++/93801 - False -Wmismatched-tags upon redundant typename gcc/cp/ChangeLog: PR c++/93801 * parser.c (cp_parser_check_class_key): Only handle true C++ class-keys. gcc/testsuite/ChangeLog: PR c++/93801 * g++.dg/warn/Wredundant-tags-3.C: New test. --- gcc/cp/ChangeLog | 5 +++ gcc/cp/parser.c | 7 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/warn/Wredundant-tags-3.C | 45 +++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 gcc/testsuite/g++.dg/warn/Wredundant-tags-3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 811e1beb0e3..fd603438d5a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2020-02-20 Martin Sebor + + PR c++/93801 + * parser.c (cp_parser_check_class_key): Only handle true C++ class-keys. + 2020-02-20 Martin Liska PR translation/93841 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 46841344831..ee534b5db21 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -30995,6 +30995,13 @@ 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 d6a153e54e3..216bac92df5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-20 Martin Sebor + + PR c++/93801 + * g++.dg/warn/Wredundant-tags-3.C: New test. + 2020-02-20 Uroš Bizjak PR target/93828 diff --git a/gcc/testsuite/g++.dg/warn/Wredundant-tags-3.C b/gcc/testsuite/g++.dg/warn/Wredundant-tags-3.C new file mode 100644 index 00000000000..7b30e949d0c --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wredundant-tags-3.C @@ -0,0 +1,45 @@ +/* PR c++/93801 - False -Wmismatched-tags upon redundant typename + { dg-do compile } + { dg-options "-Wall -Wredundant-tags" } */ + +namespace N +{ + class C { }; + enum E { }; + struct S { }; + union U { }; + + template class TC { }; + template struct TS { }; + template union TU { }; +} + +N::C c1; +typename N::C c2; // { dg-bogus "-Wredundant-tags" } +class N::C c3; // { dg-warning "-Wredundant-tags" } + +N::E e1; +typename N::E e2; // { dg-bogus "-Wredundant-tags" } +enum N::E e3; // { dg-warning "-Wredundant-tags" } + +N::S s1; +typename N::S s2; // { dg-bogus "-Wredundant-tags" } +struct N::S s3; // { dg-warning "-Wredundant-tags" } + +N::U u1; +typename N::U u2; // { dg-bogus "-Wredundant-tags" } + // { dg-bogus "'class' tag used in naming 'union N::U" "pr93809" { xfail *-*-*} .-1 } +union N::U u3; // { dg-warning "-Wredundant-tags" } + + +typedef N::TC<0> TC0; +typedef typename N::TC<0> TC0; +typedef class N::TC<0> TC0; // { dg-warning "-Wredundant-tags" "pr93809" { xfail *-*-*} .-1 } + +typedef N::TS<0> TS0; +typedef typename N::TS<0> TS0; +typedef struct N::TS<0> TS0; // { dg-warning "-Wredundant-tags" "pr93809" { xfail *-*-*} .-1 } + +typedef N::TS<0> TS0; +typedef typename N::TS<0> TS0; +typedef struct N::TS<0> TS0; // { dg-warning "-Wredundant-tags" "pr93809" { xfail *-*-*} .-1 } -- 2.30.2