Skip to content

Commit

Permalink
[flang][openacc] Add clause validity tests for the update directive
Browse files Browse the repository at this point in the history
Add couple of clause validity tests for the update directive and check for
the restriction where at least self, host or device clause must appear on the directive.

Reviewed By: sameeranjoshi

Differential Revision: https://reviews.llvm.org/D92447
  • Loading branch information
clementval committed Dec 4, 2020
1 parent f69936f commit e460654
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
2 changes: 2 additions & 0 deletions flang/lib/Semantics/check-acc-structure.cpp
Expand Up @@ -201,6 +201,8 @@ void AccStructureChecker::Leave(const parser::OpenACCStandaloneConstruct &x) {
CheckRequireAtLeastOneOf();
break;
case llvm::acc::Directive::ACCD_update:
// Restriction - line 2636
CheckRequireAtLeastOneOf();
// Restriction - 2301
CheckOnlyAllowedAfter(llvm::acc::Clause::ACCC_device_type,
updateOnlyAllowedAfterDeviceTypeClauses);
Expand Down
30 changes: 29 additions & 1 deletion flang/test/Semantics/acc-clause-validity.f90
Expand Up @@ -138,9 +138,37 @@ program openacc_clause_validity
!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.)
Expand Down

0 comments on commit e460654

Please sign in to comment.