diff options
author | Mark Mitchell <mark@codesourcery.com> | 2001-06-06 03:08:21 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2001-06-06 03:08:21 +0000 |
commit | 7b2b3f29e59c06c3c75c62f5e9148b186d8fca07 (patch) | |
tree | 0b8a183489dc0531743dd25e38c68e69337e0836 | |
parent | 9166f7a36ad696ddce1faecbed02a271587261dd (diff) | |
download | gcc-7b2b3f29e59c06c3c75c62f5e9148b186d8fca07.zip gcc-7b2b3f29e59c06c3c75c62f5e9148b186d8fca07.tar.gz gcc-7b2b3f29e59c06c3c75c62f5e9148b186d8fca07.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/c-decl.c | 15 | ||||
-rw-r--r-- | gcc/c-semantics.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20010605-1.c | 11 |
4 files changed, 43 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c7cf35..77cf395 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-06-05 Mark Mitchell <mark@codesourcery.com> + + * 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 <obrien@FreeBSD.org> * config.gcc, config/sparc/bsd.h: Do not directly include diff --git a/gcc/c-decl.c b/gcc/c-decl.c index e60ab9d..378b53e 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 7f88e97..63b4b14 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 0000000..4bf230b --- /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); +} |