OSDN Git Service

2008-07-19 Tobias Burnus <burnus@net-b.de>
authorburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jul 2008 18:29:18 +0000 (18:29 +0000)
committerburnus <burnus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 19 Jul 2008 18:29:18 +0000 (18:29 +0000)
        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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137986 138bc75d-0d04-0410-961f-82ee72b054a4

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 dc592ed..9325c45 100644 (file)
@@ -1,5 +1,11 @@
 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.
index a53c69b..0092f40 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 a487a3e..6ac4232 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