-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[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 llvm/llvm-project#67283.
- Loading branch information
Showing
7 changed files
with
99 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
! 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
! 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 |