Commit 43e1c5f7 by Francois-Xavier Coudert Committed by François-Xavier Coudert

re PR fortran/17229 (parser confused by arithmetic if inside an if)

	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.

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

From-SVN: r97825
parent 66beb87a
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> 2005-04-07 Steven G. Kargl <kargls@comcast.net>
* simplify.c (gfc_simplify_exponent): Fix exponent(tiny(x)) * simplify.c (gfc_simplify_exponent): Fix exponent(tiny(x))
......
...@@ -899,6 +899,39 @@ cleanup: ...@@ -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 /* 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 forms of it, the simple IF, the IF that starts a block and the
arithmetic IF. arithmetic IF.
...@@ -1036,6 +1069,7 @@ gfc_match_if (gfc_statement * if_type) ...@@ -1036,6 +1069,7 @@ gfc_match_if (gfc_statement * if_type)
match ("exit", gfc_match_exit, ST_EXIT) match ("exit", gfc_match_exit, ST_EXIT)
match ("forall", match_simple_forall, ST_FORALL) match ("forall", match_simple_forall, ST_FORALL)
match ("go to", gfc_match_goto, ST_GOTO) 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 ("inquire", gfc_match_inquire, ST_INQUIRE)
match ("nullify", gfc_match_nullify, ST_NULLIFY) match ("nullify", gfc_match_nullify, ST_NULLIFY)
match ("open", gfc_match_open, ST_OPEN) match ("open", gfc_match_open, ST_OPEN)
......
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> 2005-04-07 Steven G. Kargl <kargls@comcast.net>
* gfortran.dg/tiny_1.f90: New test. * gfortran.dg/tiny_1.f90: New test.
......
! 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment