mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-16 22:06:36 +00:00

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.
30 lines
513 B
Fortran
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
|