@@ -7023,19 +7023,25 @@ void CodeGenFunction::EmitOMPInteropDirective(const OMPInteropDirective &S) {
70237023 S.getSingleClause <OMPUseClause>())) &&
70247024 " OMPNowaitClause clause is used separately in OMPInteropDirective." );
70257025
7026- if (const auto *C = S.getSingleClause <OMPInitClause>()) {
7027- llvm::Value *InteropvarPtr =
7028- EmitLValue (C->getInteropVar ()).getPointer (*this );
7029- llvm::omp::OMPInteropType InteropType = llvm::omp::OMPInteropType::Unknown;
7030- if (C->getIsTarget ()) {
7031- InteropType = llvm::omp::OMPInteropType::Target;
7032- } else {
7033- assert (C->getIsTargetSync () && " Expected interop-type target/targetsync" );
7034- InteropType = llvm::omp::OMPInteropType::TargetSync;
7026+ auto ItOMPInitClause = S.getClausesOfKind <OMPInitClause>();
7027+ if (!ItOMPInitClause.empty ()) {
7028+ // Look at the multiple init clauses
7029+ for (const OMPInitClause *C : ItOMPInitClause) {
7030+ llvm::Value *InteropvarPtr =
7031+ EmitLValue (C->getInteropVar ()).getPointer (*this );
7032+ llvm::omp::OMPInteropType InteropType =
7033+ llvm::omp::OMPInteropType::Unknown;
7034+ if (C->getIsTarget ()) {
7035+ InteropType = llvm::omp::OMPInteropType::Target;
7036+ } else {
7037+ assert (C->getIsTargetSync () &&
7038+ " Expected interop-type target/targetsync" );
7039+ InteropType = llvm::omp::OMPInteropType::TargetSync;
7040+ }
7041+ OMPBuilder.createOMPInteropInit (Builder, InteropvarPtr, InteropType,
7042+ Device, NumDependences, DependenceList,
7043+ Data.HasNowaitClause );
70357044 }
7036- OMPBuilder.createOMPInteropInit (Builder, InteropvarPtr, InteropType, Device,
7037- NumDependences, DependenceList,
7038- Data.HasNowaitClause );
70397045 } else if (const auto *C = S.getSingleClause <OMPDestroyClause>()) {
70407046 llvm::Value *InteropvarPtr =
70417047 EmitLValue (C->getInteropVar ()).getPointer (*this );
0 commit comments