Commit e2346a33 by Joseph Myers

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.
parent ab7c7b46
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
......
......@@ -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. */
......
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.
......
/* 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)
{
}
/* 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)
{
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment