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); } 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 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(itr->second->u)}; + const auto &alignedNameList{ + std::get>(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/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