diff mbox

[C] Don't output warning twice (PR c/63626)

Message ID 20141023112844.GJ10501@redhat.com
State New
Headers show

Commit Message

Marek Polacek Oct. 23, 2014, 11:28 a.m. UTC
At present, we print the "inline function ... declared but never
defined" warning twice.  The reason for that is that this warning
is being printed in pop_scope, which is called when popping file
scope (c_common_parse_file->pop_file_scope), and when popping
external scope (c_write_global_declarations).  I think we should
not print this warning when popping the external scope.
We don't have to worry about nested functions here.

Writing a proper testcase is a little bit tricky, but I hope what
I did would work fine.

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

2014-10-23  Marek Polacek  <polacek@redhat.com>

	PR c/63626
	* c-decl.c (pop_scope): Don't print warning in external_scope.

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


	Marek

Comments

Joseph Myers Oct. 23, 2014, 4:39 p.m. UTC | #1
On Thu, 23 Oct 2014, Marek Polacek wrote:

> At present, we print the "inline function ... declared but never
> defined" warning twice.  The reason for that is that this warning
> is being printed in pop_scope, which is called when popping file
> scope (c_common_parse_file->pop_file_scope), and when popping
> external scope (c_write_global_declarations).  I think we should
> not print this warning when popping the external scope.
> We don't have to worry about nested functions here.
> 
> Writing a proper testcase is a little bit tricky, but I hope what
> I did would work fine.
> 
> Bootstrapped/regtested on x86_64-linux, ok for trunk?
> 
> 2014-10-23  Marek Polacek  <polacek@redhat.com>
> 
> 	PR c/63626
> 	* c-decl.c (pop_scope): Don't print warning in external_scope.
> 
> 	* gcc.dg/pr63626.c: New test.

OK.
diff mbox

Patch

diff --git gcc/c/c-decl.c gcc/c/c-decl.c
index b18da48..7d1840e 100644
--- gcc/c/c-decl.c
+++ gcc/c/c-decl.c
@@ -1182,7 +1182,8 @@  pop_scope (void)
 		 with an inline function specifier ... shall also be defined
 		 in the same translation unit."  */
 	      if (!flag_gnu89_inline
-		  && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (p)))
+		  && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (p))
+		  && scope != external_scope)
 		pedwarn (input_location, 0,
 			 "inline function %q+D declared but never defined", p);
 	      DECL_EXTERNAL (p) = 1;
diff --git gcc/testsuite/gcc.dg/pr63626.c gcc/testsuite/gcc.dg/pr63626.c
index e69de29..1f03818 100644
--- gcc/testsuite/gcc.dg/pr63626.c
+++ gcc/testsuite/gcc.dg/pr63626.c
@@ -0,0 +1,8 @@ 
+/* PR c/63626 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+/* Test that we don't output the warning twice.  */
+
+inline int foo (void); /* { dg-bogus "inline function.*inline function" } */
+/* { dg-warning "inline function .foo. declared but never defined" "" { target *-*-* } 7 } */