Skip to content

Commit 63d5e64

Browse files
authored
[Flang] [Semantics] [OpenMP] Add semantic checks for ALLOCATE directive (llvm#123421)
Add following semantic checks for ALLOCATE directive as per OpenMP 6.0 standard. - List item in ALLOCATE directive must not be a dummy argument - List item in ALLOCATE directive must not have POINTER attribute - List item in ALLOCATE directive must not be a associate name
1 parent 77148fc commit 63d5e64

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

flang/lib/Semantics/check-omp-structure.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -1712,6 +1712,28 @@ void OmpStructureChecker::Enter(const parser::OpenMPDeclarativeAllocate &x) {
17121712
const auto &objectList{std::get<parser::OmpObjectList>(x.t)};
17131713
PushContextAndClauseSets(dir.source, llvm::omp::Directive::OMPD_allocate);
17141714
const auto &clauseList{std::get<parser::OmpClauseList>(x.t)};
1715+
SymbolSourceMap currSymbols;
1716+
GetSymbolsInObjectList(objectList, currSymbols);
1717+
for (auto &[symbol, source] : currSymbols) {
1718+
if (IsPointer(*symbol)) {
1719+
context_.Say(source,
1720+
"List item '%s' in ALLOCATE directive must not have POINTER "
1721+
"attribute"_err_en_US,
1722+
source.ToString());
1723+
}
1724+
if (IsDummy(*symbol)) {
1725+
context_.Say(source,
1726+
"List item '%s' in ALLOCATE directive must not be a dummy "
1727+
"argument"_err_en_US,
1728+
source.ToString());
1729+
}
1730+
if (symbol->GetUltimate().has<AssocEntityDetails>()) {
1731+
context_.Say(source,
1732+
"List item '%s' in ALLOCATE directive must not be an associate "
1733+
"name"_err_en_US,
1734+
source.ToString());
1735+
}
1736+
}
17151737
for (const auto &clause : clauseList.v) {
17161738
CheckAlignValue(clause);
17171739
}

flang/test/Semantics/OpenMP/allocate04.f90

+15-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,26 @@
44
! OpenMP Version 5.0
55
! 2.11.3 allocate Directive
66
! Only the allocator clause is allowed on the allocate directive
7-
subroutine allocate()
7+
! List item in ALLOCATE directive must not be a dummy argument
8+
! List item in ALLOCATE directive must not have POINTER attribute
9+
! List item in ALLOCATE directive must not be a associate name
10+
subroutine allocate(z)
811
use omp_lib
12+
use iso_c_binding
913

10-
integer :: x, y
14+
type(c_ptr), pointer :: p
15+
integer :: x, y, z
1116

17+
associate (a => x)
1218
!$omp allocate(x) allocator(omp_default_mem_alloc)
1319

1420
!ERROR: PRIVATE clause is not allowed on the ALLOCATE directive
1521
!$omp allocate(y) private(y)
22+
!ERROR: List item 'z' in ALLOCATE directive must not be a dummy argument
23+
!$omp allocate(z)
24+
!ERROR: List item 'p' in ALLOCATE directive must not have POINTER attribute
25+
!$omp allocate(p)
26+
!ERROR: List item 'a' in ALLOCATE directive must not be an associate name
27+
!$omp allocate(a)
28+
end associate
1629
end subroutine allocate

0 commit comments

Comments
 (0)