Skip to content

Commit f6d59f6

Browse files
committed
add recovery to openacc block parser
1 parent d6b4310 commit f6d59f6

File tree

2 files changed

+33
-75
lines changed

2 files changed

+33
-75
lines changed

flang/lib/Parser/openacc-parsers.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,12 @@ namespace Fortran::parser {
2323
// other types of line comments from fixed form.
2424
constexpr auto startAccLine{skipStuffBeforeStatement >>
2525
withMessage(
26-
"expected OpenACC directive sentinal: '!$ACC' (free-form), 'C$ACC', or '*$ACC' (fixed-form)"_err_en_US,
26+
"expected OpenACC directive sentinal: !$ACC (free-form) / C$ACC or *$ACC (fixed-form)"_err_en_US,
2727
"!$ACC "_sptok)};
28-
constexpr auto endAccLine{space >> endOfLine};
28+
constexpr auto endAccLine{space >>
29+
recovery(
30+
withMessage("expected end of OpenACC directive"_err_en_US, endOfLine),
31+
SkipTo<'\n'>{} || ok)};
2932

3033
// Autogenerated clauses parser. Information is taken from ACC.td and the
3134
// parser is generated by tablegen.
@@ -225,12 +228,19 @@ TYPE_PARSER(sourced(construct<AccBeginBlockDirective>(
225228
sourced(Parser<AccBlockDirective>{}), Parser<AccClauseList>{})))
226229

227230
TYPE_PARSER(startAccLine >> sourced(construct<AccEndBlockDirective>("END"_tok >>
228-
sourced(Parser<AccBlockDirective>{}))))
231+
sourced(recovery(Parser<AccBlockDirective>{},
232+
construct<AccBlockDirective>(pure(
233+
llvm::acc::Directive::ACCD_data)))))))
229234

230235
TYPE_PARSER(construct<OpenACCBlockConstruct>(
231236
Parser<AccBeginBlockDirective>{} / endAccLine, block,
232-
withMessage("expected OpenACC end block directive"_err_en_US,
233-
Parser<AccEndBlockDirective>{} / endAccLine)))
237+
// TODO: This still allows mismatched directives.
238+
recovery(withMessage("expected OpenACC end block directive"_err_en_US,
239+
Parser<AccEndBlockDirective>{} / endAccLine),
240+
// TODO: Is there a simpler way to build this?
241+
sourced(construct<AccEndBlockDirective>(
242+
sourced(construct<AccBlockDirective>(
243+
pure(llvm::acc::Directive::ACCD_data))))))))
234244

235245
// Standalone constructs
236246
TYPE_PARSER(construct<OpenACCStandaloneConstruct>(
@@ -254,8 +264,11 @@ TYPE_PARSER(sourced(construct<OpenACCEndConstruct>(
254264
TYPE_CONTEXT_PARSER("OpenACC construct"_en_US,
255265
startAccLine >>
256266
withMessage("expected OpenACC directive"_err_en_US,
257-
first(construct<OpenACCConstruct>(Parser<OpenACCBlockConstruct>{}),
267+
// Combined constructs before block constructs so we try to match
268+
// the longest possible match first.
269+
first(
258270
construct<OpenACCConstruct>(Parser<OpenACCCombinedConstruct>{}),
271+
construct<OpenACCConstruct>(Parser<OpenACCBlockConstruct>{}),
259272
construct<OpenACCConstruct>(Parser<OpenACCLoopConstruct>{}),
260273
construct<OpenACCConstruct>(
261274
Parser<OpenACCStandaloneConstruct>{}),

flang/test/Parser/acc-data-statement.f90

Lines changed: 14 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ program acc_data_test
5656
print *, "Inside if block"
5757
! First error in the file.
5858
!CHECK: acc-data-statement.f90:
59-
!CHECK-SAME: [[ELINE1:[0-9]+]]:{{[0-9]+}}:
6059
!CHECK-SAME: error: expected OpenACC end block directive
6160
!CHECK-NEXT: end if
6261
!CHECK-NEXT: ^
@@ -66,15 +65,6 @@ program acc_data_test
6665
!CHECK-NEXT: in the context: IF construct
6766
!CHECK-NEXT: if (.true.) then
6867
!CHECK-NEXT: ^
69-
!CHECK-NEXT: error: expected OpenACC end block directive
70-
!CHECK-NEXT: end if
71-
!CHECK-NEXT: ^
72-
!CHECK-NEXT: in the context: OpenACC construct
73-
!CHECK-NEXT: !$acc data copyout(a)
74-
!CHECK-NEXT: ^
75-
!CHECK-NEXT: in the context: IF construct
76-
!CHECK-NEXT: if (.true.) then
77-
!CHECK-NEXT: ^
7868
end if
7969

8070
! Data construct within DO loop
@@ -84,8 +74,6 @@ program acc_data_test
8474
! !$acc end data
8575
print *, "Loop iteration", i
8676
!CHECK: acc-data-statement.f90:
87-
!CHECK-NOT: [[ELINE1]]
88-
!CHECK-SAME: [[ELINE2:[0-9]+]]:{{[0-9]+}}:
8977
!CHECK-SAME: error: expected OpenACC end block directive
9078
!CHECK-NEXT: end do
9179
!CHECK-NEXT: ^
@@ -95,15 +83,6 @@ program acc_data_test
9583
!CHECK-NEXT: in the context: DO construct
9684
!CHECK-NEXT: do i = 1, 10
9785
!CHECK-NEXT: ^
98-
!CHECK-NEXT: error: expected OpenACC end block directive
99-
!CHECK-NEXT: end do
100-
!CHECK-NEXT: ^
101-
!CHECK-NEXT: in the context: OpenACC construct
102-
!CHECK-NEXT: !$acc data present(a)
103-
!CHECK-NEXT: ^
104-
!CHECK-NEXT: in the context: DO construct
105-
!CHECK-NEXT: do i = 1, 10
106-
!CHECK-NEXT: ^
10786
end do
10887

10988
! Nested data constructs
@@ -117,67 +96,31 @@ program acc_data_test
11796

11897
print *, "Program finished"
11998
!CHECK: acc-data-statement.f90:
120-
!CHECK-NOT: [[ELINE2]]
121-
!CHECK-SAME: [[ELINE3:[0-9]+]]:{{[0-9]+}}:
12299
!CHECK-SAME: error: expected OpenACC end block directive
123100
!CHECK-NEXT: contains
124101
!CHECK-NEXT: ^
125102
!CHECK-NEXT: in the context: OpenACC construct
126103
!CHECK-NEXT: !$acc data copy(s)
127104
!CHECK-NEXT: ^
128-
!CHECK-NEXT: in the context: execution part
129-
!CHECK-NEXT: !$acc data copy(a, b) create(c)
130-
!CHECK-NEXT: ^
131-
!CHECK-NEXT: error: expected OpenACC end block directive
132-
!CHECK-NEXT: contains
133-
!CHECK-NEXT: ^
134-
!CHECK-NEXT: in the context: OpenACC construct
135-
!CHECK-NEXT: !$acc data copy(s)
136-
!CHECK-NEXT: ^
137105
!CHECK-NEXT: in the context: OpenACC construct
138106
!CHECK-NEXT: !$acc data copyin(a)
139107
!CHECK-NEXT: ^
140-
!CHECK-NEXT: error: expected OpenACC end block directive
108+
!CHECK: acc-data-statement.f90:
109+
!CHECK-SAME: error: expected OpenACC end block directive
141110
!CHECK-NEXT: contains
142111
!CHECK-NEXT: ^
143112
!CHECK-NEXT: in the context: OpenACC construct
144113
!CHECK-NEXT: !$acc data copyin(a)
145114
!CHECK-NEXT: ^
146-
!CHECK-NEXT: in the context: execution part
147-
!CHECK-NEXT: !$acc data copy(a, b) create(c)
148-
!CHECK-NEXT: ^
149-
!CHECK-NEXT: error: expected OpenACC end block directive
150-
!CHECK-NEXT: contains
151-
!CHECK-NEXT: ^
152-
!CHECK-NEXT: in the context: OpenACC construct
153-
!CHECK-NEXT: !$acc data copy(s)
154-
!CHECK-NEXT: ^
155115
!CHECK-NEXT: in the context: OpenACC construct
156116
!CHECK-NEXT: !$acc data copy(a, b) create(d)
157117
!CHECK-NEXT: ^
158-
!CHECK-NEXT: error: expected OpenACC end block directive
159-
!CHECK-NEXT: contains
160-
!CHECK-NEXT: ^
161-
!CHECK-NEXT: in the context: OpenACC construct
162-
!CHECK-NEXT: !$acc data copy(s)
163-
!CHECK-NEXT: ^
164-
!CHECK-NEXT: in the context: OpenACC construct
165-
!CHECK-NEXT: !$acc data copyin(a)
166-
!CHECK-NEXT: ^
167-
!CHECK-NEXT: error: expected OpenACC end block directive
118+
!CHECK: acc-data-statement.f90:
119+
!CHECK-SAME: error: expected OpenACC end block directive
168120
!CHECK-NEXT: contains
169-
!CHECK-NEXT: ^
170-
!CHECK-NEXT: in the context: OpenACC construct
171-
!CHECK-NEXT: !$acc data copyin(a)
172-
!CHECK-NEXT: ^
173-
!CHECK-NEXT: in the context: OpenACC construct
174-
!CHECK-NEXT: !$acc data copy(a, b) create(d)
175121
!CHECK-NEXT: ^
176-
!CHECK-NEXT: error: expected OpenACC end block directive
177-
!CHECK-NEXT: contains
178-
!CHECK-NEXT: ^
179122
!CHECK-NEXT: in the context: OpenACC construct
180-
!CHECK-NEXT: !$acc data copy(a, b) create(d)
123+
!CHECK-NEXT: $acc data copy(a, b) create(d)
181124
!CHECK-NEXT: ^
182125
!CHECK-NEXT: in the context: execution part
183126
!CHECK-NEXT: !$acc data copy(a, b) create(c)
@@ -212,14 +155,15 @@ subroutine negative_process_array(x)
212155
x = x + 1
213156
! !$acc end data
214157
print *, "Subroutine finished"
215-
!CHECK: error: expected OpenACC directive
216-
!CHECK-NEXT: !$acc data copy(x)
217-
!CHECK-NEXT: ^
218-
!CHECK-NEXT: in the context: specification construct
158+
!CHECK: acc-data-statement.f90:
159+
!CHECK-SAME: error: expected OpenACC end block directive
160+
!CHECK-NEXT: end subroutine
161+
!CHECK-NEXT: ^
162+
!CHECK-NEXT: in the context: OpenACC construct
219163
!CHECK-NEXT: !$acc data copy(x)
220164
!CHECK-NEXT: ^
221-
!CHECK-NEXT: in the context: specification part
222-
!CHECK-NEXT: integer, intent(inout) :: x(:)
165+
!CHECK-NEXT: in the context: SUBROUTINE subprogram
166+
!CHECK-NEXT: subroutine negative_process_array(x)
223167
!CHECK-NEXT: ^
224168
end subroutine
225169

@@ -232,7 +176,8 @@ function negative_compute_sum(x) result(total)
232176
total = total + x
233177
! !$acc end data
234178
print *, "Function finished"
235-
!CHECK: error: expected OpenACC end block directive
179+
!CHECK: acc-data-statement.f90:
180+
!CHECK-SAME: error: expected OpenACC end block directive
236181
!CHECK-NEXT: end function
237182
!CHECK-NEXT: ^
238183
!CHECK-NEXT: in the context: OpenACC construct

0 commit comments

Comments
 (0)