diff --git a/flang/test/Lower/OpenACC/acc-update.f90 b/flang/test/Lower/OpenACC/acc-update.f90 --- a/flang/test/Lower/OpenACC/acc-update.f90 +++ b/flang/test/Lower/OpenACC/acc-update.f90 @@ -16,7 +16,6 @@ ! CHECK: acc.update dataOperands(%[[DEVPTR_A]] : !fir.ref>){{$}} ! CHECK: acc.update_host accPtr(%[[DEVPTR_A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) to varPtr(%[[A]] : !fir.ref>) {name = "a", structured = false} - !$acc update host(a) if(.true.) ! CHECK: %[[DEVPTR_A:.*]] = acc.getdeviceptr varPtr(%[[A]] : !fir.ref>) bounds(%{{.*}}, %{{.*}}) -> !fir.ref> {dataClause = 17 : i64, name = "a", structured = false} ! CHECK: %[[IF1:.*]] = arith.constant true diff --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp --- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp +++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp @@ -655,6 +655,12 @@ if (getWaitDevnum() && getWaitOperands().empty()) return emitError("wait_devnum cannot appear without waitOperands"); + for (mlir::Value operand : getDataClauseOperands()) + if (!mlir::isa( + operand.getDefiningOp())) + return emitError("expect data entry/exit operation or acc.getdeviceptr " + "as defining op"); + return success(); } diff --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir --- a/mlir/test/Dialect/OpenACC/invalid.mlir +++ b/mlir/test/Dialect/OpenACC/invalid.mlir @@ -219,3 +219,8 @@ // expected-error@+1 {{operand #0 must be integer or index, but got 'f32'}} %1 = acc.bounds lowerbound(%0 : f32) +// ----- + +%value = memref.alloc() : memref<10xf32> +// expected-error@+1 {{expect data entry/exit operation or acc.getdeviceptr as defining op}} +acc.update dataOperands(%value : memref<10xf32>)