assigned_goto = GFC_DECL_ASSIGN_ADDR (se.expr);
- code = code->block;
- if (code == NULL)
- {
- target = fold_build1 (GOTO_EXPR, void_type_node, assigned_goto);
- gfc_add_expr_to_block (&se.pre, target);
- return gfc_finish_block (&se.pre);
- }
-
- /* Check the label list. */
- 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);
+ /* We're going to ignore a label list. It does not really change the
+ statement's semantics (because it is just a further restriction on
+ what's legal code); before, we were comparing label addresses here, but
+ that's a very fragile business and may break with optimization. So
+ just ignore it. */
+
+ target = fold_build1 (GOTO_EXPR, void_type_node, assigned_goto);
+ gfc_add_expr_to_block (&se.pre, target);
+ 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>
Bill Maddox <maddox@google.com>
Cary Coutant <ccoutant@google.com>
--- /dev/null
+! { 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
--- /dev/null
+! { 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