[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