This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[C PATCH] Set DECL_EXTERNAL on inline functions without body (PR target/39013)


Hi!

When an inline function doesn't have a body defined in current CU,
we error on it with -std=gnu99 -pedantic-errors, or just warn, or don't
warn, but in all cases but error we should IMHO set DECL_EXTERNAL on it,
because the function is certainly not defined in current CU.

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

2009-01-30  Jakub Jelinek  <jakub@redhat.com>

	PR target/39013
	* c-decl.c (pop_scope): Set DECL_EXTERNAL for functions declared
	inline but never defined.

	* gcc.target/i386/pr39013-1.c: New test.
	* gcc.target/i386/pr39013-2.c: New test.

--- gcc/c-decl.c.jj	2009-01-26 15:24:44.000000000 +0100
+++ gcc/c-decl.c	2009-01-30 15:59:22.000000000 +0100
@@ -781,14 +781,19 @@ pop_scope (void)
 	      error ("nested function %q+D declared but never defined", p);
 	      undef_nested_function = true;
 	    }
-	  /* C99 6.7.4p6: "a function with external linkage... declared
-	     with an inline function specifier ... shall also be defined in the
-	     same translation unit."  */
 	  else if (DECL_DECLARED_INLINE_P (p)
 		   && TREE_PUBLIC (p)
-		   && !DECL_INITIAL (p)
-		   && !flag_gnu89_inline)
-	    pedwarn (input_location, 0, "inline function %q+D declared but never defined", p);
+		   && !DECL_INITIAL (p))
+	    {
+	      /* C99 6.7.4p6: "a function with external linkage... declared
+		 with an inline function specifier ... shall also be defined
+		 in the same translation unit."  */
+	      if (!flag_gnu89_inline)
+		pedwarn (input_location, 0,
+			 "inline function %q+D declared but never defined", p);
+	      if (!DECL_EXTERNAL (p))
+		DECL_EXTERNAL (p) = 1;
+	    }
 
 	  goto common_symbol;
 
--- gcc/testsuite/gcc.target/i386/pr39013-1.c.jj	2009-01-30 16:15:06.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/pr39013-1.c	2009-01-30 16:17:05.000000000 +0100
@@ -0,0 +1,15 @@
+/* PR target/39013 */
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fpie -std=gnu89" } */
+
+inline int foo (void);
+extern inline int bar (void);
+
+int
+main (void)
+{
+  return foo () + bar ();
+}
+
+/* { dg-final { scan-assembler "foo@PLT" } } */
+/* { dg-final { scan-assembler "bar@PLT" } } */
--- gcc/testsuite/gcc.target/i386/pr39013-2.c.jj	2009-01-30 16:15:06.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/pr39013-2.c	2009-01-30 16:17:15.000000000 +0100
@@ -0,0 +1,15 @@
+/* PR target/39013 */
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fpie -std=gnu99" } */
+
+inline int foo (void);		/* { dg-warning "declared but never defined" } */
+extern inline int bar (void);	/* { dg-warning "declared but never defined" } */
+
+int
+main (void)
+{
+  return foo () + bar ();
+}
+
+/* { dg-final { scan-assembler "foo@PLT" } } */
+/* { dg-final { scan-assembler "bar@PLT" } } */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]