diff --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp --- a/flang/lib/Lower/OpenACC.cpp +++ b/flang/lib/Lower/OpenACC.cpp @@ -2311,7 +2311,6 @@ const Fortran::parser::AccClauseList &accClauseList) { mlir::Value ifCond, deviceNum, defaultAsync; llvm::SmallVector deviceTypeOperands; - fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder(); Fortran::lower::StatementContext stmtCtx; diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp --- a/flang/lib/Semantics/check-acc-structure.cpp +++ b/flang/lib/Semantics/check-acc-structure.cpp @@ -351,7 +351,6 @@ CHECK_SIMPLE_CLAUSE(Detach, ACCC_detach) CHECK_SIMPLE_CLAUSE(Device, ACCC_device) CHECK_SIMPLE_CLAUSE(DeviceNum, ACCC_device_num) -CHECK_SIMPLE_CLAUSE(DeviceType, ACCC_device_type) CHECK_SIMPLE_CLAUSE(Finalize, ACCC_finalize) CHECK_SIMPLE_CLAUSE(Firstprivate, ACCC_firstprivate) CHECK_SIMPLE_CLAUSE(Host, ACCC_host) @@ -487,6 +486,19 @@ modifierClause, llvm::acc::Clause::ACCC_copyout); } +void AccStructureChecker::Enter(const parser::AccClause::DeviceType &d) { + CheckAllowed(llvm::acc::Clause::ACCC_device_type); + if (GetContext().directive == llvm::acc::Directive::ACCD_set && + d.v.v.size() > 1) { + context_.Say(GetContext().clauseSource, + "The %s clause on the %s directive accepts only one value"_err_en_US, + parser::ToUpperCaseLetters( + llvm::acc::getOpenACCClauseName(llvm::acc::Clause::ACCC_device_type) + .str()), + ContextDirectiveAsFortran()); + } +} + void AccStructureChecker::Enter(const parser::AccClause::Gang &g) { CheckAllowed(llvm::acc::Clause::ACCC_gang); diff --git a/flang/test/Lower/OpenACC/acc-set.f90 b/flang/test/Lower/OpenACC/acc-set.f90 --- a/flang/test/Lower/OpenACC/acc-set.f90 +++ b/flang/test/Lower/OpenACC/acc-set.f90 @@ -13,7 +13,7 @@ !$acc set device_type(*) -!$acc set device_type(0,1) +!$acc set device_type(0) end @@ -35,7 +35,6 @@ ! CHECK: acc.set device_type(%[[C_1]] : index) ! CHECK: %[[C0:.*]] = arith.constant 0 : i32 -! CHECK: %[[C1:.*]] = arith.constant 1 : i32 -! CHECK: acc.set device_type(%[[C0]], %[[C1]] : i32, i32) +! CHECK: acc.set device_type(%[[C0]] : i32) diff --git a/flang/test/Semantics/OpenACC/acc-set-validity.f90 b/flang/test/Semantics/OpenACC/acc-set-validity.f90 --- a/flang/test/Semantics/OpenACC/acc-set-validity.f90 +++ b/flang/test/Semantics/OpenACC/acc-set-validity.f90 @@ -90,15 +90,17 @@ !$acc set device_num(1) device_num(i) !ERROR: At most one DEVICE_TYPE clause can appear on the SET directive - !$acc set device_type(i) device_type(2, i, j) + !$acc set device_type(i) device_type(2) !$acc set default_async(2) !$acc set default_async(i) !$acc set device_num(1) !$acc set device_num(i) !$acc set device_type(i) - !$acc set device_type(2, i, j) - !$acc set device_num(1) default_async(2) device_type(2, i, j) + !$acc set device_num(1) default_async(2) device_type(2) + + !ERROR: The DEVICE_TYPE clause on the SET directive accepts only one value + !$acc set device_type(1, 2) !ERROR: At least one of DEFAULT_ASYNC, DEVICE_NUM, DEVICE_TYPE clause must appear on the SET directive !$acc set