[flang-commits] [flang] [flang][openacc] Avoid crash when variable is not declared in reduction (PR #114603)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Fri Nov 1 13:52:07 PDT 2024
https://github.com/clementval created https://github.com/llvm/llvm-project/pull/114603
Do not check redutction type when the variable has not been declared. Correct error is then emitted.
>From 6252e9cd6e69800cfe06660a71d0beff2bf9a748 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Fri, 1 Nov 2024 13:50:27 -0700
Subject: [PATCH] [flang][openacc] Avoid crash when variable is not delcared in
reduction
---
flang/lib/Semantics/check-acc-structure.cpp | 40 ++++++++++---------
.../OpenACC/acc-reduction-validity.f90 | 5 +++
2 files changed, 26 insertions(+), 19 deletions(-)
diff --git a/flang/lib/Semantics/check-acc-structure.cpp b/flang/lib/Semantics/check-acc-structure.cpp
index 623e31341a7c20..7afc285e7b9ae3 100644
--- a/flang/lib/Semantics/check-acc-structure.cpp
+++ b/flang/lib/Semantics/check-acc-structure.cpp
@@ -674,26 +674,28 @@ void AccStructureChecker::Enter(const parser::AccClause::Reduction &reduction) {
common::visitors{
[&](const parser::Designator &designator) {
if (const auto *name = getDesignatorNameIfDataRef(designator)) {
- const auto *type{name->symbol->GetType()};
- if (type->IsNumeric(TypeCategory::Integer) &&
- !reductionIntegerSet.test(op.v)) {
- context_.Say(GetContext().clauseSource,
- "reduction operator not supported for integer type"_err_en_US);
- } else if (type->IsNumeric(TypeCategory::Real) &&
- !reductionRealSet.test(op.v)) {
- context_.Say(GetContext().clauseSource,
- "reduction operator not supported for real type"_err_en_US);
- } else if (type->IsNumeric(TypeCategory::Complex) &&
- !reductionComplexSet.test(op.v)) {
- context_.Say(GetContext().clauseSource,
- "reduction operator not supported for complex type"_err_en_US);
- } else if (type->category() ==
- Fortran::semantics::DeclTypeSpec::Category::Logical &&
- !reductionLogicalSet.test(op.v)) {
- context_.Say(GetContext().clauseSource,
- "reduction operator not supported for logical type"_err_en_US);
+ if (name->symbol) {
+ const auto *type{name->symbol->GetType()};
+ if (type->IsNumeric(TypeCategory::Integer) &&
+ !reductionIntegerSet.test(op.v)) {
+ context_.Say(GetContext().clauseSource,
+ "reduction operator not supported for integer type"_err_en_US);
+ } else if (type->IsNumeric(TypeCategory::Real) &&
+ !reductionRealSet.test(op.v)) {
+ context_.Say(GetContext().clauseSource,
+ "reduction operator not supported for real type"_err_en_US);
+ } else if (type->IsNumeric(TypeCategory::Complex) &&
+ !reductionComplexSet.test(op.v)) {
+ context_.Say(GetContext().clauseSource,
+ "reduction operator not supported for complex type"_err_en_US);
+ } else if (type->category() ==
+ Fortran::semantics::DeclTypeSpec::Category::Logical &&
+ !reductionLogicalSet.test(op.v)) {
+ context_.Say(GetContext().clauseSource,
+ "reduction operator not supported for logical type"_err_en_US);
+ }
+ // TODO: check composite type.
}
- // TODO: check composite type.
}
},
[&](const Fortran::parser::Name &name) {
diff --git a/flang/test/Semantics/OpenACC/acc-reduction-validity.f90 b/flang/test/Semantics/OpenACC/acc-reduction-validity.f90
index ccd009bffa2e24..cecc7e0f507b25 100644
--- a/flang/test/Semantics/OpenACC/acc-reduction-validity.f90
+++ b/flang/test/Semantics/OpenACC/acc-reduction-validity.f90
@@ -3,6 +3,7 @@
! Check OpenACC reduction validity.
program openacc_reduction_validity
+ implicit none
integer :: i
real :: r
@@ -168,5 +169,9 @@ program openacc_reduction_validity
!$acc parallel reduction(ieor:l)
!$acc end parallel
+ !ERROR: No explicit type declared for 'xyz'
+ !$acc parallel reduction(+:xyz)
+ !$acc end parallel
+
end program
More information about the flang-commits
mailing list