aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2003-12-05 07:46:35 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-12-05 06:46:35 +0000
commit6e3077c6087cfcf64d814641adc019a2a85c763e (patch)
treead0e21ca2e7c1cb2a9d00489abf7bf7d0bc9fb0e /gcc/testsuite
parented31a8173b85434c124d5627ae9265f6ea0c6c6a (diff)
downloadgcc-6e3077c6087cfcf64d814641adc019a2a85c763e.zip
gcc-6e3077c6087cfcf64d814641adc019a2a85c763e.tar.gz
gcc-6e3077c6087cfcf64d814641adc019a2a85c763e.tar.bz2
re PR middle-end/11151 (__builtin_return(__builtin_apply(...)) gives wrong result)
PR middle-end/11151 * function.h (struct function): New field 'x_naked_return_label'. * function.c (free_after_compilation): Set it to NULL. (expand_function_end): Emit 'naked_return_label' if it exists. * rtl.h (expand_naked_return): Declare. * stmt.c (expand_naked_return): New function to generate a jump to 'naked_return_label'. * builtins.c (expand_builtin_return): Call expand_naked_return instead of expand_null_return. * config/sparc/sparc.md (untyped_return): Likewise. From-SVN: r74312
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/builtin-return-1.c26
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ff1d874..49abc91 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2003-12-05 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * gcc.dg/builtin-return-1.c: New test.
+
2003-12-04 Stuart Menefy <stuart.menefy@st.com>
J"orn Rennecke <joern.rennecke@superh.com>
diff --git a/gcc/testsuite/gcc.dg/builtin-return-1.c b/gcc/testsuite/gcc.dg/builtin-return-1.c
new file mode 100644
index 0000000..d228915
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/builtin-return-1.c
@@ -0,0 +1,26 @@
+/* PR middle-end/11151 */
+/* Originator: Andrew Church <gcczilla@achurch.org> */
+/* { dg-do run } */
+
+/* This used to fail on SPARC because the (undefined) return
+ value of 'bar' was overwriting that of 'foo'. */
+
+extern void abort(void);
+
+int foo(int n)
+{
+ return n+1;
+}
+
+int bar(int n)
+{
+ __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(), 64));
+}
+
+int main(void)
+{
+ if (bar(1) != 2)
+ abort();
+
+ return 0;
+}