Commit 8fdcb6a9 by Tobias Burnus Committed by Tobias Burnus

gfortran.h (gfc_copy_formal_args_intr): Update prototype.

2014-06-12  Tobias Burnus  <burnus@net-b.de>

        * gfortran.h (gfc_copy_formal_args_intr): Update prototype.
        * symbol.c (gfc_copy_formal_args_intr): Handle the case
        that absent optional arguments should be ignored.
        * trans-intrinsic.c (gfc_get_symbol_for_expr): Ditto.
        (gfc_conv_intrinsic_funcall,
        conv_generic_with_optional_char_arg): Update call.
        * resolve.c (gfc_resolve_intrinsic): Ditto.

From-SVN: r211587
parent 551a6341
2014-06-12 Tobias Burnus <burnus@net-b.de>
* gfortran.h (gfc_copy_formal_args_intr): Update prototype.
* symbol.c (gfc_copy_formal_args_intr): Handle the case
that absent optional arguments should be ignored.
* trans-intrinsic.c (gfc_get_symbol_for_expr): Ditto.
(gfc_conv_intrinsic_funcall,
conv_generic_with_optional_char_arg): Update call.
* resolve.c (gfc_resolve_intrinsic): Ditto.
2014-06-10 Dominique d'Humieres <dominiq@lps.ens.fr> 2014-06-10 Dominique d'Humieres <dominiq@lps.ens.fr>
Mikael Morin <mikael@gcc.gnu.org> Mikael Morin <mikael@gcc.gnu.org>
......
...@@ -2785,7 +2785,8 @@ gfc_symbol* gfc_get_ultimate_derived_super_type (gfc_symbol*); ...@@ -2785,7 +2785,8 @@ gfc_symbol* gfc_get_ultimate_derived_super_type (gfc_symbol*);
bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *); bool gfc_type_is_extension_of (gfc_symbol *, gfc_symbol *);
bool gfc_type_compatible (gfc_typespec *, gfc_typespec *); bool gfc_type_compatible (gfc_typespec *, gfc_typespec *);
void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *); void gfc_copy_formal_args_intr (gfc_symbol *, gfc_intrinsic_sym *,
gfc_actual_arglist *);
void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.c, too */ void gfc_free_finalizer (gfc_finalizer *el); /* Needed in resolve.c, too */
......
...@@ -1674,7 +1674,7 @@ gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc) ...@@ -1674,7 +1674,7 @@ gfc_resolve_intrinsic (gfc_symbol *sym, locus *loc)
return false; return false;
} }
gfc_copy_formal_args_intr (sym, isym); gfc_copy_formal_args_intr (sym, isym, NULL);
sym->attr.pure = isym->pure; sym->attr.pure = isym->pure;
sym->attr.elemental = isym->elemental; sym->attr.elemental = isym->elemental;
......
...@@ -4042,16 +4042,21 @@ add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal) ...@@ -4042,16 +4042,21 @@ add_proc_interface (gfc_symbol *sym, ifsrc source, gfc_formal_arglist *formal)
each arg is set according to the existing ones. This function is each arg is set according to the existing ones. This function is
used when creating procedure declaration variables from a procedure used when creating procedure declaration variables from a procedure
declaration statement (see match_proc_decl()) to create the formal declaration statement (see match_proc_decl()) to create the formal
args based on the args of a given named interface. */ args based on the args of a given named interface.
When an actual argument list is provided, skip the absent arguments.
To be used together with gfc_se->ignore_optional. */
void void
gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src) gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src,
gfc_actual_arglist *actual)
{ {
gfc_formal_arglist *head = NULL; gfc_formal_arglist *head = NULL;
gfc_formal_arglist *tail = NULL; gfc_formal_arglist *tail = NULL;
gfc_formal_arglist *formal_arg = NULL; gfc_formal_arglist *formal_arg = NULL;
gfc_intrinsic_arg *curr_arg = NULL; gfc_intrinsic_arg *curr_arg = NULL;
gfc_formal_arglist *formal_prev = NULL; gfc_formal_arglist *formal_prev = NULL;
gfc_actual_arglist *act_arg = actual;
/* Save current namespace so we can change it for formal args. */ /* Save current namespace so we can change it for formal args. */
gfc_namespace *parent_ns = gfc_current_ns; gfc_namespace *parent_ns = gfc_current_ns;
...@@ -4062,6 +4067,17 @@ gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src) ...@@ -4062,6 +4067,17 @@ gfc_copy_formal_args_intr (gfc_symbol *dest, gfc_intrinsic_sym *src)
for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next) for (curr_arg = src->formal; curr_arg; curr_arg = curr_arg->next)
{ {
/* Skip absent arguments. */
if (actual)
{
gcc_assert (act_arg != NULL);
if (act_arg->expr == NULL)
{
act_arg = act_arg->next;
continue;
}
act_arg = act_arg->next;
}
formal_arg = gfc_get_formal_arglist (); formal_arg = gfc_get_formal_arglist ();
gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym)); gfc_get_symbol (curr_arg->name, gfc_current_ns, &(formal_arg->sym));
......
...@@ -2371,7 +2371,7 @@ gfc_conv_intrinsic_minmax_char (gfc_se * se, gfc_expr * expr, int op) ...@@ -2371,7 +2371,7 @@ gfc_conv_intrinsic_minmax_char (gfc_se * se, gfc_expr * expr, int op)
has the generic name. */ has the generic name. */
static gfc_symbol * static gfc_symbol *
gfc_get_symbol_for_expr (gfc_expr * expr) gfc_get_symbol_for_expr (gfc_expr * expr, bool ignore_optional)
{ {
gfc_symbol *sym; gfc_symbol *sym;
...@@ -2394,7 +2394,9 @@ gfc_get_symbol_for_expr (gfc_expr * expr) ...@@ -2394,7 +2394,9 @@ gfc_get_symbol_for_expr (gfc_expr * expr)
sym->as->rank = expr->rank; sym->as->rank = expr->rank;
} }
gfc_copy_formal_args_intr (sym, expr->value.function.isym); gfc_copy_formal_args_intr (sym, expr->value.function.isym,
ignore_optional ? expr->value.function.actual
: NULL);
return sym; return sym;
} }
...@@ -2413,7 +2415,7 @@ gfc_conv_intrinsic_funcall (gfc_se * se, gfc_expr * expr) ...@@ -2413,7 +2415,7 @@ gfc_conv_intrinsic_funcall (gfc_se * se, gfc_expr * expr)
else else
gcc_assert (expr->rank == 0); gcc_assert (expr->rank == 0);
sym = gfc_get_symbol_for_expr (expr); sym = gfc_get_symbol_for_expr (expr, se->ignore_optional);
/* Calls to libgfortran_matmul need to be appended special arguments, /* Calls to libgfortran_matmul need to be appended special arguments,
to be able to call the BLAS ?gemm functions if required and possible. */ to be able to call the BLAS ?gemm functions if required and possible. */
...@@ -4584,7 +4586,8 @@ conv_generic_with_optional_char_arg (gfc_se* se, gfc_expr* expr, ...@@ -4584,7 +4586,8 @@ conv_generic_with_optional_char_arg (gfc_se* se, gfc_expr* expr,
} }
/* Build the call itself. */ /* Build the call itself. */
sym = gfc_get_symbol_for_expr (expr); gcc_assert (!se->ignore_optional);
sym = gfc_get_symbol_for_expr (expr, false);
gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr, gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr,
append_args); append_args);
gfc_free_symbol (sym); gfc_free_symbol (sym);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment