Commit 5e2be41f by Tobias Burnus Committed by Tobias Burnus

re PR fortran/36795 (crash with character allocatable array argument)

2008-07-19  Tobias Burnus  <burnus@net-b.de>

        PR fortran/36795
        * matchexp.c (gfc_get_parentheses): Remove obsolete workaround,
        which caused the generation of wrong code.

2008-07-19  Tobias Burnus  <burnus@net-b.de>

        PR fortran/36795
        * char_expr_1.f90: New.
        * char_expr_2.f90: New.

From-SVN: r137986
parent e513a086
2008-07-19 Tobias Burnus <burnus@net-b.de>
PR fortran/36795
* matchexp.c (gfc_get_parentheses): Remove obsolete workaround,
which caused the generation of wrong code.
2008-07-19 Tobias Burnus <burnus@net-b.de>
PR fortran/36342
* scanner.c (load_file): Add argument to destinguish between
true filename and displayed filename.
......
......@@ -130,13 +130,6 @@ gfc_get_parentheses (gfc_expr *e)
{
gfc_expr *e2;
/* This is a temporary fix, awaiting the patch for various
other character problems. The resolution and translation
of substrings and concatenations are so kludged up that
putting parentheses around them breaks everything. */
if (e->ts.type == BT_CHARACTER && e->ref)
return e;
e2 = gfc_get_expr();
e2->expr_type = EXPR_OP;
e2->ts = e->ts;
......
2008-07-19 Tobias Burnus <burnus@net-b.de>
PR fortran/36795
* char_expr_1.f90: New.
* char_expr_2.f90: New.
2008-07-19 Olivier Hainque <hainque@adacore.com>
* gcc.dg/mallign.c: New test.
......
! { dg-do "run" }
! PR fortran/36795
! "(str)" (= an expression) was regarded as "str" (= a variable)
! and thus when yy was deallocated so was xx. Result: An invalid
! memory access.
!
program main
implicit none
character (len=10), allocatable :: str(:)
allocate (str(1))
str(1) = "dog"
if (size(str) /= 1 .or. str(1) /= "dog") call abort()
contains
subroutine foo(xx,yy)
character (len=*), intent(in) :: xx(:)
character (len=*), intent(out), allocatable :: yy(:)
allocate (yy(size(xx)))
yy = xx
end subroutine foo
end program main
! { dg-do compile }
! PR fortran/36803
! PR fortran/36795
!
! "(n)" was simplified to the EXPR_VARIABLE "n"
! and thus "(n)" was judged as definable.
!
interface
subroutine foo(x)
character, intent(out) :: x(:) ! or INTENT(INOUT)
end subroutine foo
end interface
character :: n(5)
call foo( (n) ) ! { dg-error "must be definable" }
end
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