From 7b2b3f29e59c06c3c75c62f5e9148b186d8fca07 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Wed, 6 Jun 2001 03:08:21 +0000 Subject: [PATCH] c-semantics.c (genrtl_scope_stmt): Write out nested inline functions here, instead of ... * c-semantics.c (genrtl_scope_stmt): Write out nested inline functions here, instead of ... * c-decl.c (c_expand_body): ... here. From-SVN: r42930 --- gcc/ChangeLog | 6 +++++ gcc/c-decl.c | 15 ++--------- gcc/c-semantics.c | 27 ++++++++++++++++--- .../gcc.c-torture/execute/20010605-1.c | 11 ++++++++ 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20010605-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c7cf35bb77..77cf39501c4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-06-05 Mark Mitchell + + * c-semantics.c (genrtl_scope_stmt): Write out nested inline + functions here, instead of ... + * c-decl.c (c_expand_body): ... here. + 2001-06-05 David O'Brien * config.gcc, config/sparc/bsd.h: Do not directly include diff --git a/gcc/c-decl.c b/gcc/c-decl.c index e60ab9de785..378b53e355f 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -6931,19 +6931,8 @@ c_expand_body (fndecl, nested_p) } if (nested_p) - { - /* Return to the enclosing function. */ - pop_function_context (); - /* If the nested function was inline, write it out if that is - necessary. */ - if (!TREE_ASM_WRITTEN (fndecl) && TREE_ADDRESSABLE (fndecl)) - { - push_function_context (); - output_inline_function (fndecl); - pop_function_context (); - } - } - + /* Return to the enclosing function. */ + pop_function_context (); } /* Check the declarations given in a for-loop for satisfying the C99 diff --git a/gcc/c-semantics.c b/gcc/c-semantics.c index 7f88e970acd..63b4b14fad5 100644 --- a/gcc/c-semantics.c +++ b/gcc/c-semantics.c @@ -561,11 +561,12 @@ void genrtl_scope_stmt (t) tree t; { + tree block = SCOPE_STMT_BLOCK (t); + if (!SCOPE_NO_CLEANUPS_P (t)) { if (SCOPE_BEGIN_P (t)) - expand_start_bindings_and_block (2 * SCOPE_NULLIFIED_P (t), - SCOPE_STMT_BLOCK (t)); + expand_start_bindings_and_block (2 * SCOPE_NULLIFIED_P (t), block); else if (SCOPE_END_P (t)) expand_end_bindings (NULL_TREE, !SCOPE_NULLIFIED_P (t), 0); } @@ -575,7 +576,27 @@ genrtl_scope_stmt (t) (SCOPE_BEGIN_P (t) ? NOTE_INSN_BLOCK_BEG : NOTE_INSN_BLOCK_END)); - NOTE_BLOCK (note) = SCOPE_STMT_BLOCK (t); + NOTE_BLOCK (note) = block; + } + + /* If we're at the end of a scope that contains inlined nested + functions, we have to decide whether or not to write them out. */ + if (block && SCOPE_END_P (t)) + { + tree fn; + + for (fn = BLOCK_VARS (block); fn; fn = TREE_CHAIN (fn)) + { + if (TREE_CODE (fn) == FUNCTION_DECL + && DECL_CONTEXT (fn) == current_function_decl + && !TREE_ASM_WRITTEN (fn) + && TREE_ADDRESSABLE (fn)) + { + push_function_context (); + output_inline_function (fn); + pop_function_context (); + } + } } } diff --git a/gcc/testsuite/gcc.c-torture/execute/20010605-1.c b/gcc/testsuite/gcc.c-torture/execute/20010605-1.c new file mode 100644 index 00000000000..4bf230ba54a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20010605-1.c @@ -0,0 +1,11 @@ +int main () +{ + int v = 42; + + static inline int fff (int x) + { + return x*10; + } + + return (fff (v) != 420); +} -- 2.30.2