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 @@ -201,6 +201,8 @@ CheckRequireAtLeastOneOf(); break; case llvm::acc::Directive::ACCD_update: + // Restriction - line 2636 + CheckRequireAtLeastOneOf(); // Restriction - 2301 CheckOnlyAllowedAfter(llvm::acc::Clause::ACCC_device_type, updateOnlyAllowedAfterDeviceTypeClauses); diff --git a/flang/test/Semantics/acc-clause-validity.f90 b/flang/test/Semantics/acc-clause-validity.f90 --- a/flang/test/Semantics/acc-clause-validity.f90 +++ b/flang/test/Semantics/acc-clause-validity.f90 @@ -138,9 +138,37 @@ !ERROR: Unmatched PARALLEL directive !$acc end parallel + !ERROR: At least one of DEVICE, HOST, SELF clause must appear on the UPDATE directive + !$acc update + !$acc update self(a, f) host(g) device(h) - !$acc update device(i) device_type(*) async + !$acc update host(aa) async(1) + + !$acc update device(bb) async(async1) + + !ERROR: At most one ASYNC clause can appear on the UPDATE directive + !$acc update host(aa, bb) async(1) async(2) + + !$acc update self(bb, cc(:)) wait(1) + + !$acc update device(aa, bb, cc) wait(wait1) + + !$acc update host(aa) host(bb) device(cc) wait(1,2) + + !$acc update device(aa, cc) wait(wait1, wait2) + + !$acc update device(aa) device_type(*) async + + !$acc update host(bb) device_type(*) wait + + !$acc update self(cc) device_type(1,2) async device_type(3) wait + + !ERROR: At most one IF clause can appear on the UPDATE directive + !$acc update device(aa) if(.true.) if(ifCondition) + + !ERROR: At most one IF_PRESENT clause can appear on the UPDATE directive + !$acc update device(bb) if_present if_present !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the UPDATE directive !$acc update device(i) device_type(*) if(.TRUE.)