[Patch, fortran] PR31205 - aliased operator assignment produces wrong result
Paul Richard Thomas
paul.richard.thomas@gmail.com
Sat Jun 30 15:03:00 GMT 2007
:ADDPATCH fortran:
This one was 'fun'! Neither aliased lhs and rhs in operator
assignments, nor INTENT(IN) actual arguments, aliased with an
INTENT(OUT) argument, would produce the correct result, if the
argument was a derived type with a default initializer.
The steps taken to fix this problem were:
(i) Generate a temporary for the rhs/INTENT(IN), using
gfc_get_parentheses. This required a bit of improvement to this
function; resolving the argument and checking for references with
non-numeric expressions. I believe that this latter will be
unnecessary when I complete the character patch (next week's task) and
will update accordingly.
(ii) Remove the initialization of derived types with a default
initializer from the caller to the callee. The reasons for doing this
are discussed in the PR. It has a gratifying effect on passing
derived types with allocatable components, in that the amount of
generated code goes down (see alloc_comp_basics_1.f90).
Note (i) involved what I believe is a misinterpretation of the
standard - see the comment and the relevant paragraph in the standard
(7.1.7.2).
The testcase is the reporter's.
Bootstrapped and regtested on x86_ia64/FC5 - OK for trunk?
Paul
2007-06-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31205
* trans-expr.c (gfc_conv_function_call): Remove the default
initialization of intent(out) derived types.
* symbol.c (gfc_lval_expr_from_sym): New function.
* matchexp.c (gfc_get_parentheses): Rsolve argument expression
and return argument, if it is not numeric and posseses a ref.
* gfortran.h : Add prototype for gfc_lval_expr_from_sym.
* resolve.c (has_default_initializer): Move higher up in file.
(resolve_code): On detecting an interface assignment, check
if the rhs and the lhs are the same symbol. If this is so,
enclose the rhs in parenetheses to generate a temporary and
prevent any possible aliasing.
(apply_default_init): Remove code making the lval and call
gfc_lval_expr_from_sym instead.
* trans-decl.c (gfc_trans_deferred_vars): Apply the a default
initializer, if any, to an intent(out) derived type, using
gfc_lval_expr_from_sym and gfc_trans_assignment. Check if
the dummy is present.
2007-06-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31205
* gfortran.dg/alloc_comp_basics_1.f90 : Restore number of
"deallocates" to 24, since patch has code rid of much spurious
code.
* gfortran.dg/interface_assignment_1.f90 : New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pr31205.diff
Type: text/x-patch
Size: 9932 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20070630/ee40ac15/attachment.bin>
More information about the Fortran
mailing list