Fix setting of DECL_CONTEXT in pushdecl (PR c/93072).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 15 Jan 2020 02:54:27 +0000 (02:54 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 15 Jan 2020 02:54:27 +0000 (02:54 +0000)
commite2346a33b05871fc065815d4cfd531dfa0195507
tree68cb8ed2cb75abd6f81449339a0c2f4a11bb1684
parentab7c7b46c35ed1be68d4c020a2f20ee96f68b64b
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.
gcc/c/ChangeLog
gcc/c/c-decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/inline-42.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/inline-43.c [new file with mode: 0644]