X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=blobdiff_plain;f=gcc%2Ffortran%2Ftrans-expr.c;h=e5c9f2486bd680dbad5dafcdfdeb661a2642c6f5;hp=190a11560daecb452e186b7a701ef9290c7664bd;hb=4e8e57b0ce67551ca61b7883e73586ba805f0a61;hpb=ca12290480f944d35229007b12e2ba08a9ae6419 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 190a11560da..e5c9f2486bd 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1853,7 +1853,7 @@ is_aliased_array (gfc_expr * e) int gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, - gfc_actual_arglist * arg) + gfc_actual_arglist * arg, tree append_args) { gfc_interface_mapping mapping; tree arglist; @@ -2031,7 +2031,7 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, && fsym->value) { gcc_assert (!fsym->attr.allocatable); - tmp = gfc_trans_assignment (e, fsym->value); + tmp = gfc_trans_assignment (e, fsym->value, false); gfc_add_expr_to_block (&se->pre, tmp); } @@ -2226,6 +2226,11 @@ gfc_conv_function_call (gfc_se * se, gfc_symbol * sym, /* Add the hidden string length parameters to the arguments. */ arglist = chainon (arglist, stringargs); + /* We may want to append extra arguments here. This is used e.g. for + calls to libgfortran_matmul_??, which need extra information. */ + if (append_args != NULL_TREE) + arglist = chainon (arglist, append_args); + /* Generate the actual call. */ gfc_conv_function_val (se, sym); /* If there are alternate return labels, function type should be @@ -2545,7 +2550,7 @@ gfc_conv_function_expr (gfc_se * se, gfc_expr * expr) sym = expr->value.function.esym; if (!sym) sym = expr->symtree->n.sym; - gfc_conv_function_call (se, sym, expr->value.function.actual); + gfc_conv_function_call (se, sym, expr->value.function.actual, NULL_TREE); } @@ -3363,7 +3368,7 @@ gfc_trans_arrayfunc_assign (gfc_expr * expr1, gfc_expr * expr2) setting up the scalarizer. */ tree -gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2) +gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2, bool init_flag) { gfc_se lse; gfc_se rse; @@ -3466,7 +3471,8 @@ gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2) else gfc_conv_expr (&lse, expr1); - tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, l_is_temp, + tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, + l_is_temp || init_flag, expr2->expr_type == EXPR_VARIABLE); gfc_add_expr_to_block (&body, tmp); @@ -3500,7 +3506,8 @@ gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2) gcc_assert (lse.ss == gfc_ss_terminator && rse.ss == gfc_ss_terminator); - tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, false, false); + tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, + false, false); gfc_add_expr_to_block (&body, tmp); } @@ -3518,7 +3525,13 @@ gfc_trans_assignment (gfc_expr * expr1, gfc_expr * expr2) } tree +gfc_trans_init_assign (gfc_code * code) +{ + return gfc_trans_assignment (code->expr, code->expr2, true); +} + +tree gfc_trans_assign (gfc_code * code) { - return gfc_trans_assignment (code->expr, code->expr2); + return gfc_trans_assignment (code->expr, code->expr2, false); }