re PR fortran/67615 (ICE on using arithmetic if with array instead of scalar)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 21 Sep 2015 18:09:13 +0000 (18:09 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 21 Sep 2015 18:09:13 +0000 (18:09 +0000)
2015-09-21  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/67615
* resolve.c (gfc_resolve_code): Check for scalar expression in
arithmetic-if.

2015-09-21  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/67615
* gfortran.dg/pr67615.f90: new test.

From-SVN: r227981

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr67615.f90 [new file with mode: 0644]

index ee6db56529d2ad86e65df84890160a429afab64b..a3b4442334457bb01602ce20ac0b35b6a8fb0c80 100644 (file)
@@ -1,3 +1,9 @@
+2015-09-21  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/67615
+       * resolve.c (gfc_resolve_code): Check for scalar expression in 
+       arithmetic-if.
+
 2015-09-17  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/52846
index a3041589df94c3d1caf54ff873808cc4268ef59d..da8aaa1ae7ba2bbafdd5a3b51d567edce0f2df68 100644 (file)
@@ -10377,15 +10377,18 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
          }
 
        case EXEC_ARITHMETIC_IF:
-         if (t
-             && code->expr1->ts.type != BT_INTEGER
-             && code->expr1->ts.type != BT_REAL)
-           gfc_error ("Arithmetic IF statement at %L requires a numeric "
-                      "expression", &code->expr1->where);
+         {
+           gfc_expr *e = code->expr1;
 
-         resolve_branch (code->label1, code);
-         resolve_branch (code->label2, code);
-         resolve_branch (code->label3, code);
+           if (t && (e->rank > 0
+                     || !(e->ts.type == BT_REAL || e->ts.type == BT_INTEGER)))
+             gfc_error ("Arithmetic IF statement at %L requires a scalar "
+                        "REAL or INTEGER expression", &code->expr1->where);
+
+           resolve_branch (code->label1, code);
+           resolve_branch (code->label2, code);
+           resolve_branch (code->label3, code);
+         }
          break;
 
        case EXEC_IF:
index 7afd523d80af75323949889993f88d1dce3797bd..8e642a852a9f6f4baf60f0feaa5f0b9c7f426b64 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-21  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/67615
+       * gfortran.dg/pr67615.f90: new test.
+
 2015-09-21  Jeff Law  <law@redhat.com>
 
        * gcc.target/h8300/andsi3_ashift_n_lower.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr67615.f90 b/gcc/testsuite/gfortran.dg/pr67615.f90
new file mode 100644 (file)
index 0000000..fb95958
--- /dev/null
@@ -0,0 +1,33 @@
+! { dg-do compile }
+! { dg-options "-std=legacy" }
+! PR fortran/67615
+!
+program foo
+
+   implicit none
+
+   integer i(2), j
+   real x
+   complex z
+   j = 2
+   if (j) 10, 20, 30
+
+   x = -1
+   if (x) 10, 20, 30
+
+   z = (1,2)
+   if (z) 10, 20, 30                   ! { dg-error "Arithmetic IF statement" }
+
+   i = [1, 2]
+   if (i) 10, 20, 30                   ! { dg-error "Arithmetic IF statement" }
+
+   if ( [1] ) 10, 20, 30               ! { dg-error "Arithmetic IF statement" }
+   if ( [1, -1] ) 10, 20, 30           ! { dg-error "Arithmetic IF statement" }
+   if ( [real :: 1, -1] ) 10, 20, 30   ! { dg-error "Arithmetic IF statement" }
+
+10 stop
+20 stop
+30 stop
+
+end program foo