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.
13 lines
203 B
Fortran
13 lines
203 B
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
subroutine bad1
|
|
lab1: do 1 j=1,10
|
|
1 continue
|
|
!ERROR: expected 'END DO'
|
|
end
|
|
|
|
subroutine bad2
|
|
lab2: do 2 j=1,10
|
|
2 k = j
|
|
!ERROR: expected 'END DO'
|
|
end
|