diff options
author | Daniel Kraft <d@domob.eu> | 2008-11-01 14:26:19 +0100 |
---|---|---|
committer | Daniel Kraft <domob@gcc.gnu.org> | 2008-11-01 14:26:19 +0100 |
commit | 12f681a099e339747f99d5275611ee373096a7a6 (patch) | |
tree | 2e2f8034dbe6387ba74d7083bb295d1062d519e9 /gcc/fortran/iresolve.c | |
parent | c6acea9d4fd505ca611df1f8b248bbbecaa4fef6 (diff) | |
download | gcc-12f681a099e339747f99d5275611ee373096a7a6.zip gcc-12f681a099e339747f99d5275611ee373096a7a6.tar.gz gcc-12f681a099e339747f99d5275611ee373096a7a6.tar.bz2 |
re PR fortran/35681 (wrong result for vector subscripted array expression in MVBITS)
2008-11-01 Daniel Kraft <d@domob.eu>
PR fortran/35681
* gfortran.h (struct gfc_code): New field `resolved_isym'.
* trans.h (gfc_build_memcpy_call): Made public.
* trans-array.h (gfc_trans_create_temp_array): New argument `initial'.
* intrinsic.c (gfc_intrinsic_sub_interface): Set resolved_isym.
* iresolve.c (create_formal_for_intents): New helper method.
(gfc_resolve_mvbits): Put dummy formal arglist on resolved_sym.
* resolve.c (resolve_call): Initialize resolved_isym to NULL.
* trans-array.c (gfc_trans_allocate_array_storage): New argument
`initial' to allow initializing the allocated storage to some initial
value copied from another array.
(gfc_trans_create_temp_array): Allow initialization of the temporary
with a copy of some other array by using the new extension.
(gfc_trans_array_constructor): Pass NULL_TREE for initial argument.
(gfc_conv_loop_setup): Ditto.
* trans-intrinsic.c (gfc_conv_intrinsic_array_transfer): Ditto.
* trans-expr.c (gfc_conv_function_call): Ditto.
(gfc_build_memcpy_call): Made public.
* trans-stmt.c (gfc_conv_elemental_dependencies): Initialize created
temporary for INTENT(INOUT) arguments to the value of the mirrored
array and clean up the temporary as very last intructions in the created
block.
* trans.c (gfc_trans_code): For EXEC_CALL, see if we have a MVBITS call
and enable elemental dependency checking if we have.
2008-11-01 Daniel Kraft <d@domob.eu>
PR fortran/35681
* gfortran.dg/mvbits_4.f90: New test.
From-SVN: r141516
Diffstat (limited to 'gcc/fortran/iresolve.c')
-rw-r--r-- | gcc/fortran/iresolve.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc/fortran/iresolve.c b/gcc/fortran/iresolve.c index f447ba2..619d7e9 100644 --- a/gcc/fortran/iresolve.c +++ b/gcc/fortran/iresolve.c @@ -2608,9 +2608,43 @@ gfc_resolve_cpu_time (gfc_code *c) } +/* Create a formal arglist based on an actual one and set the INTENTs given. */ + +static gfc_formal_arglist* +create_formal_for_intents (gfc_actual_arglist* actual, const sym_intent* ints) +{ + gfc_formal_arglist* head; + gfc_formal_arglist* tail; + int i; + + if (!actual) + return NULL; + + head = tail = gfc_get_formal_arglist (); + for (i = 0; actual; actual = actual->next, tail = tail->next, ++i) + { + gfc_symbol* sym; + + sym = gfc_new_symbol ("dummyarg", NULL); + sym->ts = actual->expr->ts; + + sym->attr.intent = ints[i]; + tail->sym = sym; + + if (actual->next) + tail->next = gfc_get_formal_arglist (); + } + + return head; +} + + void gfc_resolve_mvbits (gfc_code *c) { + static const sym_intent INTENTS[] = {INTENT_IN, INTENT_IN, INTENT_IN, + INTENT_INOUT, INTENT_IN}; + const char *name; gfc_typespec ts; gfc_clear_ts (&ts); @@ -2632,6 +2666,10 @@ gfc_resolve_mvbits (gfc_code *c) c->resolved_sym = gfc_get_intrinsic_sub_symbol (name); /* Mark as elemental subroutine as this does not happen automatically. */ c->resolved_sym->attr.elemental = 1; + + /* Create a dummy formal arglist so the INTENTs are known later for purpose + of creating temporaries. */ + c->resolved_sym->formal = create_formal_for_intents (c->ext.actual, INTENTS); } |