[flang-commits] [flang] 7f64e8f - [flang][openacc] Avoid crash when variable is not declared in reduction (#114603)
via flang-commits
flang-commits at lists.llvm.org
Sun Nov 3 17:27:44 PST 2024
Author: Valentin Clement (バレンタイン クレメン)
Date: 2024-11-03T17:27:41-08:00
New Revision: 7f64e8f69186fcae365aa0c3da7668e02515444b
URL: https://github.com/llvm/llvm-project/commit/7f64e8f69186fcae365aa0c3da7668e02515444b
DIFF: https://github.com/llvm/llvm-project/commit/7f64e8f69186fcae365aa0c3da7668e02515444b.diff
LOG: [flang][openacc] Avoid crash when variable is not declared in reduction (#114603)
Added:
Modified:
flang/lib/Semantics/check-acc-structure.cpp
flang/test/Semantics/OpenACC/acc-reduction-validity.f90
Removed:
################################################################################
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