Commit 916bd5f0 by Daniel Kraft Committed by Daniel Kraft

re PR fortran/41403 (miscompilation of goto/label using code)

2009-10-05  Daniel Kraft  <d@domob.eu>

	PR fortran/41403
	* trans-stmt.c (gfc_trans_goto): Ignore statement list on assigned goto
	if it is present.

2009-10-05  Daniel Kraft  <d@domob.eu>

	PR fortran/41403
	* gfortran.dg/goto_6.f: New test.
	* gfortran.dg/goto_7.f: New test.

From-SVN: r152448
parent 114bbac6
2009-10-05 Daniel Kraft <d@domob.eu>
PR fortran/41403
* trans-stmt.c (gfc_trans_goto): Ignore statement list on assigned goto
if it is present.
2009-10-03 Richard Guenther <rguenther@suse.de> 2009-10-03 Richard Guenther <rguenther@suse.de>
* options.c (gfc_post_options): Handle -flto and -fwhopr. * options.c (gfc_post_options): Handle -flto and -fwhopr.
......
...@@ -159,31 +159,15 @@ gfc_trans_goto (gfc_code * code) ...@@ -159,31 +159,15 @@ gfc_trans_goto (gfc_code * code)
assigned_goto = GFC_DECL_ASSIGN_ADDR (se.expr); assigned_goto = GFC_DECL_ASSIGN_ADDR (se.expr);
code = code->block; /* We're going to ignore a label list. It does not really change the
if (code == NULL) statement's semantics (because it is just a further restriction on
{ what's legal code); before, we were comparing label addresses here, but
target = fold_build1 (GOTO_EXPR, void_type_node, assigned_goto); that's a very fragile business and may break with optimization. So
gfc_add_expr_to_block (&se.pre, target); just ignore it. */
return gfc_finish_block (&se.pre);
} target = fold_build1 (GOTO_EXPR, void_type_node, assigned_goto);
gfc_add_expr_to_block (&se.pre, target);
/* Check the label list. */ return gfc_finish_block (&se.pre);
do
{
target = gfc_get_label_decl (code->label1);
tmp = gfc_build_addr_expr (pvoid_type_node, target);
tmp = fold_build2 (EQ_EXPR, boolean_type_node, tmp, assigned_goto);
tmp = build3_v (COND_EXPR, tmp,
fold_build1 (GOTO_EXPR, void_type_node, target),
build_empty_stmt (input_location));
gfc_add_expr_to_block (&se.pre, tmp);
code = code->block;
}
while (code != NULL);
gfc_trans_runtime_check (true, false, boolean_true_node, &se.pre, &loc,
"Assigned label is not in the list");
return gfc_finish_block (&se.pre);
} }
......
2009-10-05 Daniel Kraft <d@domob.eu>
PR fortran/41403
* gfortran.dg/goto_6.f: New test.
* gfortran.dg/goto_7.f: New test.
2009-10-03 Ben Elliston <bje@au.ibm.com> 2009-10-03 Ben Elliston <bje@au.ibm.com>
Bill Maddox <maddox@google.com> Bill Maddox <maddox@google.com>
Cary Coutant <ccoutant@google.com> Cary Coutant <ccoutant@google.com>
......
! { dg-do run }
! { dg-options "-w" }
! PR fortran/41403
! Assigned-goto with label list used to compare label addresses which
! failed with optimization. Check this works correctly now.
! This is the most reduced Fortran code from the PR.
IVFAIL=0
ASSIGN 1263 TO I
GO TO I, (1262,1263,1264)
1262 ICON01 = 1262
GO TO 1265
1263 ICON01 = 1263
GO TO 1265
1264 ICON01 = 1264
1265 CONTINUE
41260 IF ( ICON01 - 1263 ) 21260, 11260, 21260
11260 IVPASS = IVPASS + 1
GO TO 1271
21260 IVFAIL = IVFAIL + 1
1271 CONTINUE
IF (IVFAIL /= 0) CALL abort ()
END
! { dg-do compile }
! { dg-options "-std=legacy" }
! Check for error message when computed and assigned gotos reference
! illegal label numbers.
ASSIGN 1 TO I
GOTO (1, 2, 3, 42), 2 ! { dg-error "is never defined" }
GOTO I, (1, 2, 3, 43) ! { dg-error "is never defined" }
1 CONTINUE
2 CONTINUE
3 CONTINUE
c No label 42 or 43.
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