Index: flang/lib/Semantics/check-omp-structure.cpp =================================================================== --- flang/lib/Semantics/check-omp-structure.cpp +++ flang/lib/Semantics/check-omp-structure.cpp @@ -534,7 +534,7 @@ // 2. Checks on clauses which fall under 'struct OmpClause' from parse-tree.h. // 3. Checks on clauses which are not in 'struct OmpClause' from parse-tree.h. -void OmpStructureChecker::Leave(const parser::OmpClauseList &) { +void OmpStructureChecker::Leave(const parser::OmpClauseList &clauseList) { // 2.7 Loop Construct Restriction if (llvm::omp::doSet.test(GetContext().directive)) { if (auto *clause{FindClause(llvm::omp::Clause::OMPC_schedule)}) { @@ -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; + for (auto const &clause : clauseList.v) { + if (const auto *alignedClause{ + std::get_if(&clause.u)}) { + const auto &alignedNameList{ + std::get>(alignedClause->v.t)}; + for (auto const &var : alignedNameList) { + if (alignedVars.count(var.ToString()) == 1) { + context_.Say( + clause.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