From 6763b9f73682fcfd494d3133cfd17bc5d914286a Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Fri, 29 Nov 2013 01:30:42 +0000 Subject: [PATCH] re PR c/57574 (-std=c99 inline function incorrectly has external linkage with prior static declaration) PR c/57574 c: * c-decl.c (merge_decls): Clear DECL_EXTERNAL for a definition of an inline function following a static declaration. testsuite: * gcc.dg/inline-35.c: New test. From-SVN: r205506 --- gcc/c/ChangeLog | 6 ++++++ gcc/c/c-decl.c | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/inline-35.c | 19 +++++++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/inline-35.c diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 5121acdc187..7016ecb4bf9 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,9 @@ +2013-11-29 Joseph Myers + + PR c/57574 + * c-decl.c (merge_decls): Clear DECL_EXTERNAL for a definition of + an inline function following a static declaration. + 2013-11-28 Jakub Jelinek PR c/59310 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index c019a3eec32..27be7fc1b03 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2343,6 +2343,14 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) && !current_function_decl) DECL_EXTERNAL (newdecl) = 0; + /* An inline definition following a static declaration is not + DECL_EXTERNAL. */ + if (new_is_definition + && (DECL_DECLARED_INLINE_P (newdecl) + || DECL_DECLARED_INLINE_P (olddecl)) + && !TREE_PUBLIC (olddecl)) + DECL_EXTERNAL (newdecl) = 0; + if (DECL_EXTERNAL (newdecl)) { TREE_STATIC (newdecl) = TREE_STATIC (olddecl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0d18af7de2..cbe455eb0aa 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-11-29 Joseph Myers + + PR c/57574 + * gcc.dg/inline-35.c: New test. + 2013-11-28 Jakub Jelinek PR c++/59297 diff --git a/gcc/testsuite/gcc.dg/inline-35.c b/gcc/testsuite/gcc.dg/inline-35.c new file mode 100644 index 00000000000..ebbb8df2fe1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-35.c @@ -0,0 +1,19 @@ +/* A function definition of an inline function following a static + declaration does not make an inline definition in C99/C11 terms. + PR 57574. */ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors" } */ + +static int n; + +static inline int f1 (void); +inline int f1 (void) { return n; } + +static int f2 (void); +inline int f2 (void) { return n; } + +static inline int f3 (void); +int f3 (void) { return n; } + +static int f4 (void); +int f4 (void) { return n; }