aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2001-06-06 03:08:21 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2001-06-06 03:08:21 +0000
commit7b2b3f29e59c06c3c75c62f5e9148b186d8fca07 (patch)
tree0b8a183489dc0531743dd25e38c68e69337e0836
parent9166f7a36ad696ddce1faecbed02a271587261dd (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/c-decl.c15
-rw-r--r--gcc/c-semantics.c27
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20010605-1.c11
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);
+}