From 4065d985ab0f012f7fc0718685f6c12cf0352929 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Thu, 23 Jan 2025 15:09:24 -0800 Subject: [PATCH] [flang][cuda] Allow complex type in cuf kernel reduce (#124185) --- flang/lib/Semantics/check-cuda.cpp | 3 ++- flang/test/Semantics/reduce.cuf | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp index d8a5639227648..f1bdb4f20a55c 100644 --- a/flang/lib/Semantics/check-cuda.cpp +++ b/flang/lib/Semantics/check-cuda.cpp @@ -553,7 +553,8 @@ static void CheckReduce( case parser::ReductionOperator::Operator::Multiply: case parser::ReductionOperator::Operator::Max: case parser::ReductionOperator::Operator::Min: - isOk = cat == TypeCategory::Integer || cat == TypeCategory::Real; + isOk = cat == TypeCategory::Integer || cat == TypeCategory::Real || + cat == TypeCategory::Complex; break; case parser::ReductionOperator::Operator::Iand: case parser::ReductionOperator::Operator::Ior: diff --git a/flang/test/Semantics/reduce.cuf b/flang/test/Semantics/reduce.cuf index 92d12ab149010..0ee7fa097432c 100644 --- a/flang/test/Semantics/reduce.cuf +++ b/flang/test/Semantics/reduce.cuf @@ -1,5 +1,5 @@ ! RUN: %python %S/test_errors.py %s %flang_fc1 -subroutine s(n,m,a,l) +subroutine s(n,m,a,l,c) integer, intent(in) :: n integer, device, intent(in) :: m(n) real, device, intent(in) :: a(n) @@ -7,6 +7,8 @@ subroutine s(n,m,a,l) integer j, mr real ar logical lr + complex :: cr + complex, device, intent(in) :: c(n) !$cuf kernel do <<<*,*>>> reduce (+:mr,ar) do j=1,n; mr = mr + m(j); ar = ar + a(j); end do !ERROR: !$CUF KERNEL DO REDUCE operation is not acceptable for a variable with type LOGICAL(4) @@ -69,4 +71,6 @@ subroutine s(n,m,a,l) !ERROR: !$CUF KERNEL DO REDUCE operation is not acceptable for a variable with type REAL(4) !$cuf kernel do <<<*,*>>> reduce (.or.:mr,ar) do j=1,n; end do +!$cuf kernel do <<<*,*>>> reduce (+:cr) ! ok complex type + do j=1,n; cr = cr + c(j); end do end