re PR fortran/67614 (ICE on using arithmetic if with null)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 25 Sep 2015 22:30:26 +0000 (22:30 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 25 Sep 2015 22:30:26 +0000 (22:30 +0000)
2015-09-25  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/67614
* resolve.c (gfc_resolve_code): Prevent ICE for invalid EXPR_NULL.

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

PR fortran/67614
* gfortran.dg/pr67614.f90: New test.

From-SVN: r228156

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

index 1e3a7a13e2b4d782d6561a6fc3e8fffec8df625a..0d39cd8391ca4445d2f1a5c236a32e91e73c08de 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-25  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/67614
+       * resolve.c (gfc_resolve_code): Prevent ICE for invalid EXPR_NULL.
+
 2015-09-25  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/67525
index 59cf03402fe26fc4a6400fa8fc4fd6df52fdcf21..c408390577628973823618e1ce653f8dda5bec4d 100644 (file)
@@ -10380,10 +10380,14 @@ gfc_resolve_code (gfc_code *code, gfc_namespace *ns)
          {
            gfc_expr *e = code->expr1;
 
+           gfc_resolve_expr (e);
+           if (e->expr_type == EXPR_NULL)
+             gfc_error ("Invalid NULL at %L", &e->where);
+
            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);
+                        "REAL or INTEGER expression", &e->where);
 
            resolve_branch (code->label1, code);
            resolve_branch (code->label2, code);
index a98e70164c01d2b299d27ae43aea318be8926237..74c0823a5bd9cb9f66c2bd84ac1668f5d9317506 100644 (file)
@@ -1,3 +1,8 @@
+2015-09-25  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/67614
+       * gfortran.dg/pr67614.f90: New test.
+
 2015-09-25  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/67525
diff --git a/gcc/testsuite/gfortran.dg/pr67614.f90 b/gcc/testsuite/gfortran.dg/pr67614.f90
new file mode 100644 (file)
index 0000000..ed07385
--- /dev/null
@@ -0,0 +1,12 @@
+! { dg-do compile }
+! { dg-options "-std=legacy" }
+! PR fortran/67614
+!
+program foo
+   implicit none
+   integer, pointer :: z
+   if (null(z)) 10, 20, 30    ! { dg-error "Invalid NULL" }
+10 continue
+20 continue
+30 continue
+end program foo