aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2012-07-03 09:06:08 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2012-07-03 09:06:08 +0000
commitb83053bf4288fa0fe49eb55027174f9bc4600c43 (patch)
treed28a2bb0690595e7ac949c57f5831fc94694588a
parent4a147e4e048576fd75cec40797cca5a972c91c48 (diff)
downloadgcc-b83053bf4288fa0fe49eb55027174f9bc4600c43.zip
gcc-b83053bf4288fa0fe49eb55027174f9bc4600c43.tar.gz
gcc-b83053bf4288fa0fe49eb55027174f9bc4600c43.tar.bz2
trans.c (Call_to_gnu): Robustify test for function case if the CICO mechanism is used.
* gcc-interface/trans.c (Call_to_gnu): Robustify test for function case if the CICO mechanism is used. From-SVN: r189204
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/trans.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/recursive_call.adb10
4 files changed, 21 insertions, 3 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f6eb89b..60f6ef8 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,10 @@
2012-07-03 Eric Botcazou <ebotcazou@adacore.com>
+ * gcc-interface/trans.c (Call_to_gnu): Robustify test for function case
+ if the CICO mechanism is used.
+
+2012-07-03 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc-interface/utils2.c (build_simple_component_ref): Do not look
through an extension if the type contains a placeholder.
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index de03cba..08a263a 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -4084,7 +4084,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
/* The first entry is for the actual return value if this is a
function, so skip it. */
- if (TREE_VALUE (gnu_cico_list) == void_type_node)
+ if (function_call)
gnu_cico_list = TREE_CHAIN (gnu_cico_list);
if (Nkind (Name (gnat_node)) == N_Explicit_Dereference)
@@ -4188,8 +4188,7 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
return value from it and update the return type. */
if (TYPE_CI_CO_LIST (gnu_subprog_type))
{
- tree gnu_elmt = value_member (void_type_node,
- TYPE_CI_CO_LIST (gnu_subprog_type));
+ tree gnu_elmt = TYPE_CI_CO_LIST (gnu_subprog_type);
gnu_call = build_component_ref (gnu_call, NULL_TREE,
TREE_PURPOSE (gnu_elmt), false);
gnu_result_type = TREE_TYPE (gnu_call);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 539dfd3..1d7c75e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,9 @@
2012-07-03 Eric Botcazou <ebotcazou@adacore.com>
+ * gnat.dg/recursive_call.adb: New test.
+
+2012-07-03 Eric Botcazou <ebotcazou@adacore.com>
+
* gnat.dg/discr37.ad[sb]: New test.
2012-07-03 Oleg Endo <olegendo@gcc.gnu.org>
diff --git a/gcc/testsuite/gnat.dg/recursive_call.adb b/gcc/testsuite/gnat.dg/recursive_call.adb
new file mode 100644
index 0000000..ab60e44
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/recursive_call.adb
@@ -0,0 +1,10 @@
+-- { dg-do compile }
+-- { dg-options "-gnat2012" }
+
+function Recursive_Call (File : String; Status : out Boolean) return Boolean is
+begin
+ if File /= "/dev/null" then
+ return Recursive_Call ("/dev/null", Status);
+ end if;
+ return False;
+end;