Commit 5e4c9ebb by Martin Sebor

Avoid printing informational notes when -Wmismatched-tags is suppressed in…

Avoid printing informational notes when -Wmismatched-tags is suppressed in system headers (PR c++/96063)

Related:
PR c++/96063 - mismatched-tags warnings in stdlib headers

gcc/cp/ChangeLog:

	PR c++/96063
	* parser.c (class_decl_loc_t::diag_mismatched_tags): Print notes only
	if warning_at returns nonzero.

gcc/testsuite/ChangeLog:

	PR c++/96063
	* g++.dg/warn/Wmismatched-tags-7.C: New test.
	* g++.dg/warn/Wmismatched-tags-8.C: New test.
parent 30529e2f
...@@ -31404,25 +31404,26 @@ class_decl_loc_t::diag_mismatched_tags (tree type_decl) ...@@ -31404,25 +31404,26 @@ class_decl_loc_t::diag_mismatched_tags (tree type_decl)
/* Issue a warning for the first mismatched declaration. /* Issue a warning for the first mismatched declaration.
Avoid using "%#qT" since the class-key for the same type will Avoid using "%#qT" since the class-key for the same type will
be the same regardless of which one was used in the declaraion. */ be the same regardless of which one was used in the declaraion. */
warning_at (loc, OPT_Wmismatched_tags, if (warning_at (loc, OPT_Wmismatched_tags,
"%qT declared with a mismatched class-key %qs", "%qT declared with a mismatched class-key %qs",
type_decl, xmatchkstr); type_decl, xmatchkstr))
{
/* Suggest how to avoid the warning for each instance since /* Suggest how to avoid the warning for each instance since
the guidance may be different depending on context. */ the guidance may be different depending on context. */
inform (loc, inform (loc,
(key_redundant_p (key_redundant_p
? G_("remove the class-key or replace it with %qs") ? G_("remove the class-key or replace it with %qs")
: G_("replace the class-key with %qs")), : G_("replace the class-key with %qs")),
xpectkstr); xpectkstr);
/* Also point to the first declaration or definition that guided /* Also point to the first declaration or definition that guided
the decision to issue the warning above. */ the decision to issue the warning above. */
inform (cdlguide->location (idxguide), inform (cdlguide->location (idxguide),
(def_p (def_p
? G_("%qT defined as %qs here") ? G_("%qT defined as %qs here")
: G_("%qT first declared as %qs here")), : G_("%qT first declared as %qs here")),
type_decl, xpectkstr); type_decl, xpectkstr);
}
/* Issue warnings for the remaining inconsistent declarations. */ /* Issue warnings for the remaining inconsistent declarations. */
for (unsigned i = idx + 1; i != ndecls; ++i) for (unsigned i = idx + 1; i != ndecls; ++i)
...@@ -31437,16 +31438,16 @@ class_decl_loc_t::diag_mismatched_tags (tree type_decl) ...@@ -31437,16 +31438,16 @@ class_decl_loc_t::diag_mismatched_tags (tree type_decl)
key_redundant_p = key_redundant (i); key_redundant_p = key_redundant (i);
/* Set the function declaration to print in diagnostic context. */ /* Set the function declaration to print in diagnostic context. */
current_function_decl = function (i); current_function_decl = function (i);
warning_at (loc, OPT_Wmismatched_tags, if (warning_at (loc, OPT_Wmismatched_tags,
"%qT declared with a mismatched class-key %qs", "%qT declared with a mismatched class-key %qs",
type_decl, xmatchkstr); type_decl, xmatchkstr))
/* Suggest how to avoid the warning for each instance since /* Suggest how to avoid the warning for each instance since
the guidance may be different depending on context. */ the guidance may be different depending on context. */
inform (loc, inform (loc,
(key_redundant_p (key_redundant_p
? G_("remove the class-key or replace it with %qs") ? G_("remove the class-key or replace it with %qs")
: G_("replace the class-key with %qs")), : G_("replace the class-key with %qs")),
xpectkstr); xpectkstr);
} }
/* Restore the current function in case it was replaced above. */ /* Restore the current function in case it was replaced above. */
/* Verify that -Wmismatched-tags doesn't print stray notes for warnings
disabled in system headers.
{ dg-do "compile" }
{ dg-options "-Wmismatched-tags" } */
# 6 "Wmismatched-tags-7.C" 1
# 1 "system-header.h" 1 3 4
# 9 "system-header.h" 3 4
class A; // { dg-bogus "first declared" }
struct A; // { dg-bogus "replace" }
# 12 "Wmismatched-tags-7.C" 2
class B; // { dg-message "first declared" }
struct B; // { dg-warning "\\\[-Wmismatched-tags" }
/* Verify that #pragma GCC diagnostic works for -Wmismatched-tags.
{ dg-do "compile" }
{ dg-options "-Wmismatched-tags" } */
#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wmismatched-tags"
class A; // { dg-message "first declared"
struct A; // { dg-error "\\\[-Werror=mismatched-tags" }
#pragma GCC diagnostic ignored "-Wmismatched-tags"
class B; // { dg-bogus "first declared" }
struct B;
#pragma GCC diagnostic warning "-Wmismatched-tags"
class C; // { dg-message "first declared"
struct C; // { dg-warning "\\\[-Wmismatched-tags" }
#pragma GCC diagnostic pop
class D; // { dg-message "first declared"
struct D; // { dg-warning "\\\[-Wmismatched-tags" }
// { dg-prune-output "some warnings being treated as errors" }
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