[PATCH] D97964: [flang][OpenMP] Add semantic check for occurrence of multiple list items in aligned clause for simd directive
Arnamoy B via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 5 14:11:52 PST 2021
arnamoy10 updated this revision to Diff 328644.
arnamoy10 added a comment.
Updated code through the use of newly introduced `FindClauseMult()` function, which returns an iterator from the `multimap`, in case where multiple occurrence of a clause happens within a directive.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D97964/new/
https://reviews.llvm.org/D97964
Files:
flang/lib/Semantics/check-directive-structure.h
flang/lib/Semantics/check-omp-structure.cpp
flang/test/Semantics/omp-simd-aligned.f90
Index: flang/test/Semantics/omp-simd-aligned.f90
===================================================================
--- /dev/null
+++ flang/test/Semantics/omp-simd-aligned.f90
@@ -0,0 +1,37 @@
+! RUN: %S/test_errors.sh %s %t %flang -fopenmp
+
+! OpenMP Version 4.5
+! 2.8.1 simd Construct
+! Semantic error for correct test case
+
+program omp_simd
+ integer i, j, k
+ integer, allocatable :: a(:), b(:)
+
+ allocate(a(10))
+ allocate(b(10))
+
+ !ERROR: List item 'a' present at multiple ALIGNED clauses
+ !$omp simd aligned(a, a)
+ do i = 1, 10
+ a(i) = i
+ end do
+ !$omp end simd
+
+ !ERROR: List item 'a' present at multiple ALIGNED clauses
+ !$omp simd aligned(a) aligned(a)
+ do i = 1, 10
+ a(i) = i
+ end do
+ !$omp end simd
+
+ !$omp simd aligned(a) aligned(b)
+ do i = 1, 10
+ a(i) = i
+ b(i) = i
+ end do
+ !$omp end simd
+
+ print *, a
+
+end program omp_simd
Index: flang/lib/Semantics/check-omp-structure.cpp
===================================================================
--- flang/lib/Semantics/check-omp-structure.cpp
+++ flang/lib/Semantics/check-omp-structure.cpp
@@ -606,7 +606,30 @@
}
}
}
- // TODO: A list-item cannot appear in more than one aligned clause
+ // A list-item cannot appear in more than one aligned clause
+ std::set<std::string> alignedVars = {};
+ bool foundErr = false;
+ auto clauseAll = FindClauseMult(llvm::omp::Clause::OMPC_aligned);
+ for (auto itr = clauseAll.first; itr != clauseAll.second; ++itr) {
+ const auto &alignedClause{
+ std::get<parser::OmpClause::Aligned>(itr->second->u)};
+ const auto &alignedNameList{
+ std::get<std::list<parser::Name>>(alignedClause.v.t)};
+ for (auto const &var : alignedNameList) {
+ if (alignedVars.count(var.ToString()) == 1) {
+ context_.Say(
+ itr->second->source,
+ "List item '%s' present at multiple ALIGNED clauses"_err_en_US,
+ var.ToString());
+ foundErr = true;
+ break;
+ }
+ alignedVars.insert(var.ToString());
+ }
+ // Report only once for multiple error within the same directive
+ if (foundErr)
+ break;
+ }
} // SIMD
// 2.7.3 Single Construct Restriction
Index: flang/lib/Semantics/check-directive-structure.h
===================================================================
--- flang/lib/Semantics/check-directive-structure.h
+++ flang/lib/Semantics/check-directive-structure.h
@@ -205,6 +205,11 @@
return nullptr;
}
+ auto FindClauseMult(C type) {
+ auto it{GetContext().clauseInfo.equal_range(type)};
+ return it;
+ }
+
void PushContext(const parser::CharBlock &source, D dir) {
dirContext_.emplace_back(source, dir);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D97964.328644.patch
Type: text/x-patch
Size: 2781 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210305/8e67a82c/attachment.bin>
More information about the llvm-commits
mailing list