re PR fortran/36795 (crash with character allocatable array argument)
authorTobias Burnus <burnus@net-b.de>
Sat, 19 Jul 2008 18:29:18 +0000 (20:29 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Sat, 19 Jul 2008 18:29:18 +0000 (20:29 +0200)
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

gcc/fortran/ChangeLog
gcc/fortran/matchexp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_expr_1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/char_expr_2.f90 [new file with mode: 0644]

index dc592eda24bfefa2011c87764b1f71ea516dee35..9325c45ff238943e145fe6e8f1e3509f5403d591 100644 (file)
@@ -1,3 +1,9 @@
+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
index a53c69bc71b88bdaa6cc5577fb6397e4ab58f5bd..0092f4086bb10077c5f6862c13ce5ebfe52085b0 100644 (file)
@@ -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;
index a487a3e74c9509b2ad8affe1cf19c590e0b7a2af..6ac4232c026e9d83cf6ea29933afa8d71ac1105f 100644 (file)
@@ -1,3 +1,9 @@
+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.
diff --git a/gcc/testsuite/gfortran.dg/char_expr_1.f90 b/gcc/testsuite/gfortran.dg/char_expr_1.f90
new file mode 100644 (file)
index 0000000..ba0e1f2
--- /dev/null
@@ -0,0 +1,20 @@
+! { 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
diff --git a/gcc/testsuite/gfortran.dg/char_expr_2.f90 b/gcc/testsuite/gfortran.dg/char_expr_2.f90
new file mode 100644 (file)
index 0000000..86499eb
--- /dev/null
@@ -0,0 +1,15 @@
+! { 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