[flang-commits] [flang] 62b127e - [flang] Fix IsConstantExpr for division expressions

Jean Perier via flang-commits flang-commits at lists.llvm.org
Thu Jun 4 00:44:51 PDT 2020


Author: Jean Perier
Date: 2020-06-04T09:44:44+02:00
New Revision: 62b127eef6b37a57a647050b0e123f6ac928215f

URL: https://github.com/llvm/llvm-project/commit/62b127eef6b37a57a647050b0e123f6ac928215f
DIFF: https://github.com/llvm/llvm-project/commit/62b127eef6b37a57a647050b0e123f6ac928215f.diff

LOG: [flang] Fix IsConstantExpr for division expressions

Summary:
Fortran::evaluate::IsConstantExpr did not check that the numerator
was a constant expression. This patch fixes the issue.

Reviewers: DavidTruby, klausler, schweitz, PeteSteinfeld, jdoerfert, sscalpone

Reviewed By: klausler, PeteSteinfeld, sscalpone

Subscribers: llvm-commits

Tags: #llvm, #flang

Differential Revision: https://reviews.llvm.org/D81096

Added: 
    

Modified: 
    flang/lib/Evaluate/check-expression.cpp
    flang/test/Semantics/resolve37.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp
index a252a964e9e5..b6c3b20b2ec4 100644
--- a/flang/lib/Evaluate/check-expression.cpp
+++ b/flang/lib/Evaluate/check-expression.cpp
@@ -68,7 +68,7 @@ class IsConstantExprHelper : public AllTraverse<IsConstantExprHelper, true> {
       const Divide<Type<TypeCategory::Integer, KIND>> &division) const {
     using T = Type<TypeCategory::Integer, KIND>;
     if (const auto divisor{GetScalarConstantValue<T>(division.right())}) {
-      return !divisor->IsZero();
+      return !divisor->IsZero() && (*this)(division.left());
     } else {
       return false;
     }

diff  --git a/flang/test/Semantics/resolve37.f90 b/flang/test/Semantics/resolve37.f90
index 7b5a488462ff..0e9d20be3a61 100644
--- a/flang/test/Semantics/resolve37.f90
+++ b/flang/test/Semantics/resolve37.f90
@@ -29,6 +29,11 @@
 integer, parameter ::  p = 0/0
 !ERROR: Must be a constant value
 integer, parameter ::  q = 1+2*(1/0)
+integer not_constant
+!ERROR: Must be a constant value
+integer, parameter :: s1 = not_constant/2
+!ERROR: Must be a constant value
+integer, parameter :: s2 = 3/not_constant
 !ERROR: Must be a constant value
 integer(kind=2/0) r
 integer, parameter :: sok(*)=[1,2]/[1,2]


        


More information about the flang-commits mailing list