diff options
author | Valentin Clement (バレンタイン クレメン) <clementval@gmail.com> | 2024-02-23 12:56:24 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-23 12:56:24 -0800 |
commit | 99f31bab86c53ed5094f57ff8a05a6ea2c8e0c38 (patch) | |
tree | 5baf07e72d486feefb3369318773a842c1a4ffe1 /flang | |
parent | ae91a427ac8f9fc7368ec052995cec6a6aeb8ea8 (diff) | |
download | llvm-99f31bab86c53ed5094f57ff8a05a6ea2c8e0c38.zip llvm-99f31bab86c53ed5094f57ff8a05a6ea2c8e0c38.tar.gz llvm-99f31bab86c53ed5094f57ff8a05a6ea2c8e0c38.tar.bz2 |
[flang][cuda] Fix semantic for the CONSTANT attribute (#82821)
Object with the CONSTANT attribute cannot be declared in the host
subprogram.
It can be declared in a module or a device subprogram.
Adapt the semantic check to trigger the error in host subprogram.
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Semantics/check-declarations.cpp | 7 | ||||
-rw-r--r-- | flang/test/Lower/CUDA/cuda-data-attribute.cuf | 10 | ||||
-rw-r--r-- | flang/test/Semantics/cuf03.cuf | 6 |
3 files changed, 12 insertions, 11 deletions
diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp index 2db3f9a..e9adc08 100644 --- a/flang/lib/Semantics/check-declarations.cpp +++ b/flang/lib/Semantics/check-declarations.cpp @@ -920,7 +920,12 @@ void CheckHelper::CheckObjectEntity( auto attr{*details.cudaDataAttr()}; switch (attr) { case common::CUDADataAttr::Constant: - if (IsAllocatableOrPointer(symbol) || symbol.attrs().test(Attr::TARGET)) { + if (subpDetails && !inDeviceSubprogram) { + messages_.Say( + "Object '%s' with ATTRIBUTES(CONSTANT) may not be declared in a host subprogram"_err_en_US, + symbol.name()); + } else if (IsAllocatableOrPointer(symbol) || + symbol.attrs().test(Attr::TARGET)) { messages_.Say( "Object '%s' with ATTRIBUTES(CONSTANT) may not be allocatable, pointer, or target"_err_en_US, symbol.name()); diff --git a/flang/test/Lower/CUDA/cuda-data-attribute.cuf b/flang/test/Lower/CUDA/cuda-data-attribute.cuf index 7596c6b..94aa623 100644 --- a/flang/test/Lower/CUDA/cuda-data-attribute.cuf +++ b/flang/test/Lower/CUDA/cuda-data-attribute.cuf @@ -16,30 +16,20 @@ module cuda_var contains subroutine local_var_attrs - real, constant :: rc real, device :: rd real, allocatable, managed :: rm real, allocatable, pinned :: rp end subroutine ! CHECK-LABEL: func.func @_QMcuda_varPlocal_var_attrs() -! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFlocal_var_attrsErc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) ! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QMcuda_varFlocal_var_attrsErd"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) ! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>) ! CHECK: %{{.*}}:2 = hlfir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> (!fir.ref<!fir.box<!fir.heap<f32>>>, !fir.ref<!fir.box<!fir.heap<f32>>>) -! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFlocal_var_attrsErc"} : (!fir.ref<f32>) -> !fir.ref<f32> ! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<device>, uniq_name = "_QMcuda_varFlocal_var_attrsErd"} : (!fir.ref<f32>) -> !fir.ref<f32> ! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<managed>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErm"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>> ! FIR: %{{.*}} = fir.declare %{{.*}} {cuda_attr = #fir.cuda<pinned>, fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QMcuda_varFlocal_var_attrsErp"} : (!fir.ref<!fir.box<!fir.heap<f32>>>) -> !fir.ref<!fir.box<!fir.heap<f32>>> -subroutine dummy_arg_constant(dc) - real, constant :: dc -end subroutine -! CHECK-LABEL: func.func @_QMcuda_varPdummy_arg_constant( -! CHECK-SAME: %[[ARG0:.*]]: !fir.ref<f32> {fir.bindc_name = "dc", fir.cuda_attr = #fir.cuda<constant>} -! CHECK: %{{.*}}:2 = hlfir.declare %[[ARG0]] {cuda_attr = #fir.cuda<constant>, uniq_name = "_QMcuda_varFdummy_arg_constantEdc"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) - subroutine dummy_arg_device(dd) real, device :: dd end subroutine diff --git a/flang/test/Semantics/cuf03.cuf b/flang/test/Semantics/cuf03.cuf index bebfdad..4260d7e 100644 --- a/flang/test/Semantics/cuf03.cuf +++ b/flang/test/Semantics/cuf03.cuf @@ -55,5 +55,11 @@ module m real, managed :: ma(n) ! ok !WARNING: Pointer 'dp' may not be associated in a device subprogram real, device, pointer :: dp + real, constant :: rc ! ok + end subroutine + + subroutine host() + !ERROR: Object 'rc' with ATTRIBUTES(CONSTANT) may not be declared in a host subprogram + real, constant :: rc end subroutine end module |