summaryrefslogtreecommitdiffstats
path: root/gcc/fortran
diff options
context:
space:
mode:
authoredlinger <edlinger@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-04 13:54:16 +0000
committeredlinger <edlinger@138bc75d-0d04-0410-961f-82ee72b054a4>2014-04-04 13:54:16 +0000
commit69a105b008311dddbcb2503fab832aaae0dd64a8 (patch)
tree28189e90068c27c5ac5c0e8779d684a26aaceab7 /gcc/fortran
parent809003b3fb402a83cc4970b5453350271956f968 (diff)
downloadppe42-gcc-69a105b008311dddbcb2503fab832aaae0dd64a8.tar.gz
ppe42-gcc-69a105b008311dddbcb2503fab832aaae0dd64a8.zip
2014-04-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR fortran/60191 * fortran/trans-types.c (gfc_get_function_type): In case of recursion build a variadic function type with empty argument list instead of a stdarg-like function type with incomplete argument list. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209091 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/trans-types.c26
1 files changed, 8 insertions, 18 deletions
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index be268cfbdec..59637f2d3cb 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2714,11 +2714,11 @@ tree
gfc_get_function_type (gfc_symbol * sym)
{
tree type;
- vec<tree, va_gc> *typelist;
+ vec<tree, va_gc> *typelist = NULL;
gfc_formal_arglist *f;
gfc_symbol *arg;
- int alternate_return;
- bool is_varargs = true, recursive_type = false;
+ int alternate_return = 0;
+ bool is_varargs = true;
/* Make sure this symbol is a function, a subroutine or the main
program. */
@@ -2730,15 +2730,12 @@ gfc_get_function_type (gfc_symbol * sym)
if (sym->backend_decl == NULL)
sym->backend_decl = error_mark_node;
else if (sym->backend_decl == error_mark_node)
- recursive_type = true;
+ goto arg_type_list_done;
else if (sym->attr.proc_pointer)
return TREE_TYPE (TREE_TYPE (sym->backend_decl));
else
return TREE_TYPE (sym->backend_decl);
- alternate_return = 0;
- typelist = NULL;
-
if (sym->attr.entry_master)
/* Additional parameter for selecting an entry point. */
vec_safe_push (typelist, gfc_array_index_type);
@@ -2786,13 +2783,6 @@ gfc_get_function_type (gfc_symbol * sym)
if (arg->attr.flavor == FL_PROCEDURE)
{
- /* We don't know in the general case which argument causes
- recursion. But we know that it is a procedure. So we give up
- creating the procedure argument type list at the first
- procedure argument. */
- if (recursive_type)
- goto arg_type_list_done;
-
type = gfc_get_function_type (arg);
type = build_pointer_type (type);
}
@@ -2846,11 +2836,11 @@ gfc_get_function_type (gfc_symbol * sym)
|| sym->attr.if_source != IFSRC_UNKNOWN)
is_varargs = false;
-arg_type_list_done:
-
- if (!recursive_type && sym->backend_decl == error_mark_node)
+ if (sym->backend_decl == error_mark_node)
sym->backend_decl = NULL_TREE;
+arg_type_list_done:
+
if (alternate_return)
type = integer_type_node;
else if (!sym->attr.function || gfc_return_by_reference (sym))
@@ -2888,7 +2878,7 @@ arg_type_list_done:
else
type = gfc_sym_type (sym);
- if (is_varargs || recursive_type)
+ if (is_varargs)
type = build_varargs_function_type_vec (type, typelist);
else
type = build_function_type_vec (type, typelist);
OpenPOWER on IntegriCloud