llvm-project/flang/test/Semantics/dosemantics13.f90
Peter Klausler 81d04709f8
[flang] Fix construct names on labeled DO (#67622)
Fortran requires that a DO construct with a construct name end with an
END DO statement bearing the same name. This is true even if the DO
construct begins with a label DO statement; e.g., "constrName: do 10
j=1,10" must end with "10 end do constrName".

The compiler presently basically ignores construct names that appear on
label DO statements, because only non-label DO statements can be parsed
as DO constructs. This causes us to miss some errors, and (worse) breaks
the usage of the construct name on CYCLE and EXIT statements.

To fix this, this patch changes the parse tree and parser so that a DO
construct name on a putative label DO statement causes it to be parsed
as a "non-label" DO statement... with a label. Only true old-style
labeled DO statements without construct names are now parsed as such.

I did not change the class name NonLabelDoStmt -- it's widely used
across the front-end, and is the name of a production in the standard's
grammar. But now it basically means DoConstructDoStmt.

Fixes https://github.com/llvm/llvm-project/issues/67283.
2023-10-16 17:29:25 -07:00

30 lines
513 B
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
program main
integer j, k
lab1: do j=1,10
cycle lab1
exit lab1
end do lab1
lab2: do 2 j=1,10
cycle lab2
exit lab2
2 end do lab2
lab3: do 3 j=1,10
cycle lab3
exit lab3
!ERROR: DO construct name required but missing
3 end do
do 4 j=1,10
!ERROR: Unexpected DO construct name 'lab4'
4 end do lab4
lab5: do 5 j=1,10
!ERROR: END DO statement must have the label '5' matching its DO statement
666 end do lab5
end