diff --git a/flang/include/flang/Semantics/symbol.h b/flang/include/flang/Semantics/symbol.h index 4cded64d170cd..9ebdd3a8081ed 100644 --- a/flang/include/flang/Semantics/symbol.h +++ b/flang/include/flang/Semantics/symbol.h @@ -786,7 +786,7 @@ class Symbol { OmpExecutableAllocateDirective, OmpDeclareSimd, OmpDeclareTarget, OmpThreadprivate, OmpDeclareReduction, OmpFlushed, OmpCriticalLock, OmpIfSpecified, OmpNone, OmpPreDetermined, OmpImplicit, OmpDependObject, - OmpInclusiveScan, OmpExclusiveScan, OmpInScanReduction); + OmpInclusiveScan, OmpExclusiveScan, OmpInScanReduction, OmpUniform); using Flags = common::EnumSet; const Scope &owner() const { return *owner_; } diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp index 9fa7bc8964854..6884607edebb3 100644 --- a/flang/lib/Semantics/resolve-directives.cpp +++ b/flang/lib/Semantics/resolve-directives.cpp @@ -550,6 +550,11 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { return false; } + bool Pre(const parser::OmpClause::Uniform &x) { + ResolveOmpNameList(x.v, Symbol::Flag::OmpUniform); + return false; + } + bool Pre(const parser::OmpInReductionClause &x) { auto &objects{std::get(x.t)}; ResolveOmpObjectList(objects, Symbol::Flag::OmpInReduction); @@ -752,7 +757,8 @@ class OmpAttributeVisitor : DirectiveAttributeVisitor { Symbol::Flag::OmpLastPrivate, Symbol::Flag::OmpReduction, Symbol::Flag::OmpCriticalLock, Symbol::Flag::OmpCopyIn, Symbol::Flag::OmpUseDevicePtr, Symbol::Flag::OmpUseDeviceAddr, - Symbol::Flag::OmpIsDevicePtr, Symbol::Flag::OmpHasDeviceAddr}; + Symbol::Flag::OmpIsDevicePtr, Symbol::Flag::OmpHasDeviceAddr, + Symbol::Flag::OmpUniform}; Symbol::Flags ompFlagsRequireMark{Symbol::Flag::OmpThreadprivate, Symbol::Flag::OmpDeclareTarget, Symbol::Flag::OmpExclusiveScan, diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 57035c57ee16f..7bea6fdb00e55 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -1511,6 +1511,11 @@ class OmpVisitor : public virtual DeclarationVisitor { return false; } + bool Pre(const parser::OpenMPDeclareSimdConstruct &x) { + AddOmpSourceRange(x.source); + return true; + } + bool Pre(const parser::OmpInitializerProc &x) { auto &procDes = std::get(x.t); auto &name = std::get(procDes.u); diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp index 2118970a7bf25..52f74035bd6a8 100644 --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -842,6 +842,9 @@ std::string Symbol::OmpFlagToClauseName(Symbol::Flag ompFlag) { case Symbol::Flag::OmpLinear: clauseName = "LINEAR"; break; + case Symbol::Flag::OmpUniform: + clauseName = "UNIFORM"; + break; case Symbol::Flag::OmpFirstPrivate: clauseName = "FIRSTPRIVATE"; break; diff --git a/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 new file mode 100644 index 0000000000000..8d986300cd750 --- /dev/null +++ b/flang/test/Semantics/OpenMP/declare-simd-uniform.f90 @@ -0,0 +1,22 @@ +! RUN: %python %S/../test_errors.py %s %flang -fopenmp +! RUN: %flang_fc1 -fopenmp -fdebug-dump-symbols %s | FileCheck %s +! Test declare simd with uniform clause + +function add2(a,b,i,fact,alc) result(c) + !$omp declare simd(add2) uniform(a,b,fact) + integer :: i + integer,pointer::alc + double precision :: a(*),b(*),fact,c + c = a(i) + b(i) + fact +end function + +end + +! CHECK-LABEL: Subprogram scope: add2 size=48 alignment=8 sourceRange=189 bytes +! CHECK-NEXT: a (OmpUniform): ObjectEntity dummy type: REAL(8) shape: 1_8:* +! CHECK-NEXT: add2 (Function): HostAssoc +! CHECK-NEXT: alc, POINTER size=24 offset=8: ObjectEntity dummy type: INTEGER(4) +! CHECK-NEXT: b (OmpUniform): ObjectEntity dummy type: REAL(8) shape: 1_8:* +! CHECK-NEXT: c size=8 offset=40: ObjectEntity funcResult type: REAL(8) +! CHECK-NEXT: fact (OmpUniform) size=8 offset=32: ObjectEntity dummy type: REAL(8) +! CHECK-NEXT: i size=4 offset=0: ObjectEntity dummy type: INTEGER(4)