diff options
-rw-r--r-- | gcc/c/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/inline-40.c | 49 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/inline-41.c | 49 |
5 files changed, 116 insertions, 2 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index fbd94f5..5ee4b66 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,12 @@ +2019-01-07 Joseph Myers <joseph@codesourcery.com> + + PR c/88720 + PR c/88726 + * c-decl.c (pop_scope): Use TREE_PUBLIC and b->nested to determine + whether a function is nested, not DECL_EXTERNAL. Diagnose inline + functions declared but never defined only for external scope, not + for other scopes. + 2019-01-07 Jakub Jelinek <jakub@redhat.com> PR c++/85052 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index d7726fa..5c7232f 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -1251,8 +1251,9 @@ pop_scope (void) && DECL_ABSTRACT_ORIGIN (p) != NULL_TREE && DECL_ABSTRACT_ORIGIN (p) != p) TREE_ADDRESSABLE (DECL_ABSTRACT_ORIGIN (p)) = 1; - if (!DECL_EXTERNAL (p) + if (!TREE_PUBLIC (p) && !DECL_INITIAL (p) + && !b->nested && scope != file_scope && scope != external_scope) { @@ -1268,7 +1269,7 @@ pop_scope (void) in the same translation unit." */ if (!flag_gnu89_inline && !lookup_attribute ("gnu_inline", DECL_ATTRIBUTES (p)) - && scope != external_scope) + && scope == external_scope) pedwarn (input_location, 0, "inline function %q+D declared but never defined", p); DECL_EXTERNAL (p) = 1; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29b3b83..ebc96a3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-01-07 Joseph Myers <joseph@codesourcery.com> + + PR c/88720 + PR c/88726 + * gcc.dg/inline-40.c, gcc.dg/inline-41.c: New tests. + 2019-01-07 Paolo Carlini <paolo.carlini@oracle.com> * g++.dg/diagnostic/constexpr1.C: New. diff --git a/gcc/testsuite/gcc.dg/inline-40.c b/gcc/testsuite/gcc.dg/inline-40.c new file mode 100644 index 0000000..d0fdaee --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-40.c @@ -0,0 +1,49 @@ +/* Test inline functions declared in inner scopes. Bugs 88720 and 88726. */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void +inline_1 (void) +{ +} + +void +inline_2 (void) +{ +} + +static void +inline_static_1 (void) +{ +} + +static void +inline_static_2 (void) +{ +} + +static void inline_static_3 (void); +static void inline_static_4 (void); + +static void +test (void) +{ + inline void inline_1 (void); + extern inline void inline_2 (void); + inline void inline_3 (void); + extern inline void inline_4 (void); + inline void inline_static_1 (void); + extern inline void inline_static_2 (void); + inline void inline_static_3 (void); + extern inline void inline_static_4 (void); +} + +void +inline_3 (void) +{ +} + +void +inline_4 (void) +{ +} diff --git a/gcc/testsuite/gcc.dg/inline-41.c b/gcc/testsuite/gcc.dg/inline-41.c new file mode 100644 index 0000000..1511aee --- /dev/null +++ b/gcc/testsuite/gcc.dg/inline-41.c @@ -0,0 +1,49 @@ +/* Test inline functions declared in inner scopes. Bugs 88720 and 88726. */ +/* { dg-do compile } */ +/* { dg-options "-fgnu89-inline" } */ + +void +inline_1 (void) +{ +} + +void +inline_2 (void) +{ +} + +static void +inline_static_1 (void) +{ +} + +static void +inline_static_2 (void) +{ +} + +static void inline_static_3 (void); +static void inline_static_4 (void); + +static void +test (void) +{ + inline void inline_1 (void); + extern inline void inline_2 (void); + inline void inline_3 (void); + extern inline void inline_4 (void); + inline void inline_static_1 (void); + extern inline void inline_static_2 (void); + inline void inline_static_3 (void); + extern inline void inline_static_4 (void); +} + +void +inline_3 (void) +{ +} + +void +inline_4 (void) +{ +} |