PR fortran/17229
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 10:56:59 +0000 (10:56 +0000)
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Apr 2005 10:56:59 +0000 (10:56 +0000)
* match.c (gfc_match_arithmetic_if): New function to match an
arithmetic IF statement.
(gfc_match_if): Use gfc_match_arithmetic_if to match an
arithmetic IF statement embedded in a simple IF statement.

* gfortran.dg/pr17229.f: New test.

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

gcc/fortran/ChangeLog
gcc/fortran/match.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr17229.f [new file with mode: 0644]

index e114853..3169f33 100644 (file)
@@ -1,3 +1,11 @@
+2005-04-08  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR fortran/17229
+       * match.c (gfc_match_arithmetic_if): New function to match an
+       arithmetic IF statement.
+       (gfc_match_if): Use gfc_match_arithmetic_if to match an
+       arithmetic IF statement embedded in a simple IF statement.
+
 2005-04-07  Steven G. Kargl  <kargls@comcast.net>
 
        * simplify.c (gfc_simplify_exponent): Fix exponent(tiny(x))
index f433db5..f2b5311 100644 (file)
@@ -899,6 +899,39 @@ cleanup:
 }
 
 
+/* We try to match an easy arithmetic IF statement. This only happens
+ * when just after having encountered a simple IF statement. This code
+ * is really duplicate with parts of the gfc_match_if code, but this is
+ * *much* easier.  */
+match
+gfc_match_arithmetic_if (void)
+{
+  gfc_st_label *l1, *l2, *l3;
+  gfc_expr *expr;
+  match m;
+
+  m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
+  if (m != MATCH_YES)
+    return m;
+
+  if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
+      || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
+      || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
+    {
+      gfc_free_expr (expr);
+      return MATCH_ERROR;
+    }
+
+  new_st.op = EXEC_ARITHMETIC_IF;
+  new_st.expr = expr;
+  new_st.label = l1;
+  new_st.label2 = l2;
+  new_st.label3 = l3;
+
+  return MATCH_YES;
+}
+
+
 /* The IF statement is a bit of a pain.  First of all, there are three
    forms of it, the simple IF, the IF that starts a block and the
    arithmetic IF.
@@ -1036,6 +1069,7 @@ gfc_match_if (gfc_statement * if_type)
     match ("exit", gfc_match_exit, ST_EXIT)
     match ("forall", match_simple_forall, ST_FORALL)
     match ("go to", gfc_match_goto, ST_GOTO)
+    match ("if", gfc_match_arithmetic_if, ST_ARITHMETIC_IF)
     match ("inquire", gfc_match_inquire, ST_INQUIRE)
     match ("nullify", gfc_match_nullify, ST_NULLIFY)
     match ("open", gfc_match_open, ST_OPEN)
index a8f5a50..1eae0ac 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-06  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
+
+       PR fortran/17229
+       * gfortran.dg/pr17229.f: New test.
+
 2005-04-07  Steven G. Kargl  <kargls@comcast.net>
 
        * gfortran.dg/tiny_1.f90: New test.
diff --git a/gcc/testsuite/gfortran.dg/pr17229.f b/gcc/testsuite/gfortran.dg/pr17229.f
new file mode 100644 (file)
index 0000000..b1a4471
--- /dev/null
@@ -0,0 +1,23 @@
+! PR fortran/17229
+! { dg-do run }
+      integer i
+      logical l
+
+      l = .false.
+      i = -1
+      if (l) if (i) 999,999,999
+
+      l = .true.
+      if (l) if (i) 10,999,999
+      go to 999
+
+   10 i = 0
+      if (l) if (i) 999,20,999
+      go to 999
+
+   20 i = 1
+      if (l) if (i) 999,999,30
+      go to 999
+
+  999 call abort
+   30 end