Skip to content

Commit 9b49392

Browse files
[Flang] Handle the source (scopes) for some OpenMP constructs (#109097)
Fixes: #82943 Fixes: #82942 Fixes: #85593
1 parent 615a5eb commit 9b49392

File tree

5 files changed

+52
-15
lines changed

5 files changed

+52
-15
lines changed

flang/lib/Parser/openmp-parsers.cpp

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -657,33 +657,36 @@ TYPE_PARSER(construct<OmpEndAtomic>(startOmpLine >> "END ATOMIC"_tok))
657657

658658
// OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] READ [MEMORY-ORDER-CLAUSE-LIST]
659659
TYPE_PARSER("ATOMIC" >>
660-
construct<OmpAtomicRead>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
661-
verbatim("READ"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
662-
statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
660+
sourced(construct<OmpAtomicRead>(
661+
Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("READ"_tok),
662+
Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
663+
maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
663664

664665
// OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] CAPTURE [MEMORY-ORDER-CLAUSE-LIST]
665666
TYPE_PARSER("ATOMIC" >>
666-
construct<OmpAtomicCapture>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
667-
verbatim("CAPTURE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
668-
statement(assignmentStmt), statement(assignmentStmt),
669-
Parser<OmpEndAtomic>{} / endOmpLine))
667+
sourced(construct<OmpAtomicCapture>(
668+
Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("CAPTURE"_tok),
669+
Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
670+
statement(assignmentStmt), Parser<OmpEndAtomic>{} / endOmpLine)))
670671

671672
// OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] UPDATE [MEMORY-ORDER-CLAUSE-LIST]
672673
TYPE_PARSER("ATOMIC" >>
673-
construct<OmpAtomicUpdate>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
674-
verbatim("UPDATE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
675-
statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
674+
sourced(construct<OmpAtomicUpdate>(
675+
Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("UPDATE"_tok),
676+
Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
677+
maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
676678

677679
// OMP ATOMIC [atomic-clause-list]
678-
TYPE_PARSER(construct<OmpAtomic>(verbatim("ATOMIC"_tok),
680+
TYPE_PARSER(sourced(construct<OmpAtomic>(verbatim("ATOMIC"_tok),
679681
Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
680-
maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
682+
maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
681683

682684
// OMP ATOMIC [MEMORY-ORDER-CLAUSE-LIST] WRITE [MEMORY-ORDER-CLAUSE-LIST]
683685
TYPE_PARSER("ATOMIC" >>
684-
construct<OmpAtomicWrite>(Parser<OmpAtomicClauseList>{} / maybe(","_tok),
685-
verbatim("WRITE"_tok), Parser<OmpAtomicClauseList>{} / endOmpLine,
686-
statement(assignmentStmt), maybe(Parser<OmpEndAtomic>{} / endOmpLine)))
686+
sourced(construct<OmpAtomicWrite>(
687+
Parser<OmpAtomicClauseList>{} / maybe(","_tok), verbatim("WRITE"_tok),
688+
Parser<OmpAtomicClauseList>{} / endOmpLine, statement(assignmentStmt),
689+
maybe(Parser<OmpEndAtomic>{} / endOmpLine))))
687690

688691
// Atomic Construct
689692
TYPE_PARSER(construct<OpenMPAtomicConstruct>(Parser<OmpAtomicRead>{}) ||

flang/lib/Semantics/resolve-names.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1530,6 +1530,23 @@ class OmpVisitor : public virtual DeclarationVisitor {
15301530
void Post(const parser::OpenMPDeclarativeAllocate &) {
15311531
SkipImplicitTyping(false);
15321532
}
1533+
bool Pre(const parser::OpenMPDeclarativeConstruct &x) {
1534+
AddOmpSourceRange(x.source);
1535+
return true;
1536+
}
1537+
void Post(const parser::OpenMPDeclarativeConstruct &) {
1538+
messageHandler().set_currStmtSource(std::nullopt);
1539+
}
1540+
bool Pre(const parser::OpenMPAtomicConstruct &x) {
1541+
return common::visit(common::visitors{[&](const auto &u) -> bool {
1542+
AddOmpSourceRange(u.source);
1543+
return true;
1544+
}},
1545+
x.u);
1546+
}
1547+
void Post(const parser::OpenMPAtomicConstruct &) {
1548+
messageHandler().set_currStmtSource(std::nullopt);
1549+
}
15331550
};
15341551

15351552
bool OmpVisitor::NeedsScope(const parser::OpenMPBlockConstruct &x) {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2+
! Test the source code starting with omp syntax
3+
4+
!$omp atomic write
5+
i = 123
6+
end
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2+
! Test the source code starting with omp syntax
3+
4+
!$omp declare simd
5+
integer :: x
6+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2+
! Test the source code starting with omp syntax
3+
4+
!$omp threadprivate(a)
5+
end

0 commit comments

Comments
 (0)