C PATCH to fix bogus inform with -Wc++-compat (PR c/81795)

Submitted by Marek Polacek on Aug. 11, 2017, 4:56 p.m.

Details

Message ID 20170811165648.GT17069@redhat.com
State New
Headers show

Commit Message

Marek Polacek Aug. 11, 2017, 4:56 p.m.
Pretty trivial patch -- these two informs weren't properly guarded so
they'd trigger even if the warning was disabled via #pragma.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2017-08-11  Marek Polacek  <polacek@redhat.com>

	PR c/81795
	* c-decl.c (pushtag): Only print inform if the warning was printed.
	(grokdeclarator): Likewise.

	* gcc.dg/pr81795.c: New test.


	Marek

Comments

Joseph S. Myers Aug. 11, 2017, 5:57 p.m.
On Fri, 11 Aug 2017, Marek Polacek wrote:

> Pretty trivial patch -- these two informs weren't properly guarded so
> they'd trigger even if the warning was disabled via #pragma.
> 
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

OK.

Patch hide | download patch | download mbox

diff --git gcc/c/c-decl.c gcc/c/c-decl.c
index d21fbc5883e..323d4480609 100644
--- gcc/c/c-decl.c
+++ gcc/c/c-decl.c
@@ -1557,11 +1557,10 @@  pushtag (location_t loc, tree name, tree type)
 	  && (TYPE_MAIN_VARIANT (TREE_TYPE (b->decl))
 	      != TYPE_MAIN_VARIANT (type)))
 	{
-	  warning_at (loc, OPT_Wc___compat,
-		      ("using %qD as both a typedef and a tag is "
-		       "invalid in C++"),
-		      b->decl);
-	  if (b->locus != UNKNOWN_LOCATION)
+	  if (warning_at (loc, OPT_Wc___compat,
+			  ("using %qD as both a typedef and a tag is "
+			   "invalid in C++"), b->decl)
+	      && b->locus != UNKNOWN_LOCATION)
 	    inform (b->locus, "originally defined here");
 	}
     }
@@ -6596,11 +6595,10 @@  grokdeclarator (const struct c_declarator *declarator,
 		  || (current_scope == file_scope && B_IN_EXTERNAL_SCOPE (b)))
 	      && TYPE_MAIN_VARIANT (b->decl) != TYPE_MAIN_VARIANT (type))
 	    {
-	      warning_at (declarator->id_loc, OPT_Wc___compat,
-			  ("using %qD as both a typedef and a tag is "
-			   "invalid in C++"),
-			  decl);
-	      if (b->locus != UNKNOWN_LOCATION)
+	      if (warning_at (declarator->id_loc, OPT_Wc___compat,
+			      ("using %qD as both a typedef and a tag is "
+			       "invalid in C++"), decl)
+		  && b->locus != UNKNOWN_LOCATION)
 		inform (b->locus, "originally defined here");
 	    }
 	}
diff --git gcc/testsuite/gcc.dg/pr81795.c gcc/testsuite/gcc.dg/pr81795.c
index e69de29bb2d..b035bd0b530 100644
--- gcc/testsuite/gcc.dg/pr81795.c
+++ gcc/testsuite/gcc.dg/pr81795.c
@@ -0,0 +1,14 @@ 
+/* PR c/81795 */
+/* { dg-do compile } */
+/* { dg-options "-Wc++-compat" } */
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wc++-compat"
+
+struct S { int f; };	/* { dg-bogus "note: originally defined here" } */
+typedef int S;		/* { dg-bogus "invalid in C\[+\]\[+\]" } */
+
+typedef int T;		/* { dg-bogus "note: originally defined here" } */
+struct T { int f; };    /* { dg-bogus "invalid in C\[+\]\[+\]" } */
+
+#pragma GCC diagnostic pop