aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2020-01-15 02:54:27 +0000
committerJoseph Myers <joseph@codesourcery.com>2020-01-15 02:54:27 +0000
commite2346a33b05871fc065815d4cfd531dfa0195507 (patch)
tree68cb8ed2cb75abd6f81449339a0c2f4a11bb1684 /gcc
parentab7c7b46c35ed1be68d4c020a2f20ee96f68b64b (diff)
downloadgcc-e2346a33b05871fc065815d4cfd531dfa0195507.zip
gcc-e2346a33b05871fc065815d4cfd531dfa0195507.tar.gz
gcc-e2346a33b05871fc065815d4cfd531dfa0195507.tar.bz2
Fix setting of DECL_CONTEXT in pushdecl (PR c/93072).
Bug 93072 is a case where the C front end (a) wrongly interprets an inline declaration at block scope as indicating that DECL_CONTEXT should be set for an inline function and (b) this results in an ICE. This is a regression resulting from a previous fix of mine for other bugs involving such declarations being wrongly interpreted elsewhere as nested function declarations. The fix is similar to the previous fix: use TREE_PUBLIC instead of DECL_EXTERNAL in another place as the relevant test to determine whether to set DECL_CONTEXT. (When a variable reaches the code in question in pushdecl, the two are equivalent.) Bootstrapped with no regressions for x86_64-pc-linux-gnu. PR c/93072 gcc/c: * c-decl.c (pushdecl): Use TREE_PUBLIC, not DECL_EXTERNAL, to determine whether to set DECL_CONTEXT. gcc/testsuite: * gcc.dg/inline-42.c, gcc.dg/inline-43.c: New tests.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/c/ChangeLog6
-rw-r--r--gcc/c/c-decl.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/inline-42.c50
-rw-r--r--gcc/testsuite/gcc.dg/inline-43.c50
5 files changed, 112 insertions, 1 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog
index b8e807e..b702b39 100644
--- a/gcc/c/ChangeLog
+++ b/gcc/c/ChangeLog
@@ -1,3 +1,9 @@
+2020-01-15 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/93072
+ * c-decl.c (pushdecl): Use TREE_PUBLIC, not DECL_EXTERNAL, to
+ determine whether to set DECL_CONTEXT.
+
2020-01-13 Joseph Myers <joseph@codesourcery.com>
PR c/93241
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index fa834d9..8281af7 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -3048,7 +3048,7 @@ pushdecl (tree x)
unless they have initializers (which generate code). */
if (current_function_decl
&& (!VAR_OR_FUNCTION_DECL_P (x)
- || DECL_INITIAL (x) || !DECL_EXTERNAL (x)))
+ || DECL_INITIAL (x) || !TREE_PUBLIC (x)))
DECL_CONTEXT (x) = current_function_decl;
/* Anonymous decls are just inserted in the scope. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 571b51a..879d7b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-15 Joseph Myers <joseph@codesourcery.com>
+
+ PR c/93072
+ * gcc.dg/inline-42.c, gcc.dg/inline-43.c: New tests.
+
2020-01-14 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/analyzer/signal-6.c: New test.
diff --git a/gcc/testsuite/gcc.dg/inline-42.c b/gcc/testsuite/gcc.dg/inline-42.c
new file mode 100644
index 0000000..f5ccea8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/inline-42.c
@@ -0,0 +1,50 @@
+/* Test inline functions declared in inner scopes. Bug 93072. */
+/* { 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
+test (void)
+{
+ inline void inline_1 (void);
+ if (inline_1 == 0) ;
+ extern inline void inline_2 (void);
+ if (inline_2 == 0) ;
+ inline void inline_3 (void);
+ if (inline_3 == 0) ;
+ extern inline void inline_4 (void);
+ if (inline_4 == 0) ;
+ inline void inline_static_1 (void);
+ if (inline_static_1 == 0) ;
+ extern inline void inline_static_2 (void);
+ if (inline_static_2 == 0) ;
+}
+
+void
+inline_3 (void)
+{
+}
+
+void
+inline_4 (void)
+{
+}
diff --git a/gcc/testsuite/gcc.dg/inline-43.c b/gcc/testsuite/gcc.dg/inline-43.c
new file mode 100644
index 0000000..87b2445
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/inline-43.c
@@ -0,0 +1,50 @@
+/* Test inline functions declared in inner scopes. Bug 93072. */
+/* { 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
+test (void)
+{
+ inline void inline_1 (void);
+ if (inline_1 == 0) ;
+ extern inline void inline_2 (void);
+ if (inline_2 == 0) ;
+ inline void inline_3 (void);
+ if (inline_3 == 0) ;
+ extern inline void inline_4 (void);
+ if (inline_4 == 0) ;
+ inline void inline_static_1 (void);
+ if (inline_static_1 == 0) ;
+ extern inline void inline_static_2 (void);
+ if (inline_static_2 == 0) ;
+}
+
+void
+inline_3 (void)
+{
+}
+
+void
+inline_4 (void)
+{
+}