]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/33664 (crash on invalid program)
authorPaul Thomas <pault@gcc.gnu.org>
Fri, 12 Oct 2007 16:45:46 +0000 (16:45 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Fri, 12 Oct 2007 16:45:46 +0000 (16:45 +0000)
2007-10-12  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/33664
* expr.c (gfc_specification_expr): If a function is not
external, intrinsic or pure is an error.  Set the symbol pure
to prevent repeat errors.

2007-10-12  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/33664
* gfortran.dg/impure_spec_expr_1.f90: New test.
* gfortran.dg/char_result_7.f90: Remove illegal test.

From-SVN: r129267

gcc/fortran/ChangeLog
gcc/fortran/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/char_result_7.f90
gcc/testsuite/gfortran.dg/impure_spec_expr_1.f90 [new file with mode: 0644]

index 3b36e3fbd67f7477f1f811b4c0ceec3035e1e87d..c6e6d7eb64addb854d599066ef1edf0a39fc9aed 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-12  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/33664
+       * expr.c (gfc_specification_expr): If a function is not
+       external, intrinsic or pure is an error.  Set the symbol pure
+       to prevent repeat errors.
+
 2007-10-10  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/33636
index 16dc2b1c66e98d7a998b791ba7fa524cca59b909..447263a263516a71c320346673ebd8ba2bee337b 100644 (file)
@@ -2526,6 +2526,18 @@ gfc_specification_expr (gfc_expr *e)
       return FAILURE;
     }
 
+  if (e->expr_type == EXPR_FUNCTION
+         && !e->value.function.isym
+         && !e->value.function.esym
+         && !gfc_pure (e->symtree->n.sym))
+    {
+      gfc_error ("Function '%s' at %L must be PURE",
+                e->symtree->n.sym->name, &e->where);
+      /* Prevent repeat error messages.  */
+      e->symtree->n.sym->attr.pure = 1;
+      return FAILURE;
+    }
+
   if (e->rank != 0)
     {
       gfc_error ("Expression at %L must be scalar", &e->where);
index 8c03b11890204b91367080379d528b58300f292f..890da97d183f43d6bb2d52db73ef7158e069a4b6 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-12  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/33664
+       * gfortran.dg/impure_spec_expr_1.f90: New test.
+       * gfortran.dg/char_result_7.f90: Remove illegal test.
+
 2007-10-12  Nathan Froyd  <froydnj@codesourcery.com>
 
        PR 11001
index a037d2b268a959c01f16380786c03e99836ab2cf..7b8692f403eaf0d9cbb05afa33d3b685f739763e 100644 (file)
@@ -16,7 +16,6 @@ program main
   end interface
 
   call test (f1 (double, 100), 200)
-  call test (f2 (double, 70), 140)
 
   call indirect (double)
 contains
@@ -31,12 +30,6 @@ contains
     f1 = ''
   end function f1
 
-  function f2 (fn, i)
-    integer :: i, fn
-    character (len = fn (i)) :: f2
-    f2 = ''
-  end function f2
-
   subroutine indirect (fn)
     interface
       integer pure function fn (x)
@@ -44,7 +37,6 @@ contains
       end function fn
     end interface
     call test (f1 (fn, 100), 200)
-    call test (f2 (fn, 70), 140)
   end subroutine indirect
 
   subroutine test (string, length)
diff --git a/gcc/testsuite/gfortran.dg/impure_spec_expr_1.f90 b/gcc/testsuite/gfortran.dg/impure_spec_expr_1.f90
new file mode 100644 (file)
index 0000000..8c42a57
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! Checks the fix for PR33664, in which the apparent function reference
+! n(1) caused a seg-fault.
+!
+! Contributed by Henrik Holst <holst@matmech.com>
+!
+module test
+contains
+  subroutine func_1(u,n)
+    integer :: n
+    integer :: u(n(1))  ! { dg-error "must be PURE" }
+  end subroutine
+end module test
+! { dg-final { cleanup-modules "test" } }
+