[flang] Fix IsConstantExpr for division expressions
authorJean Perier <jperier@nvidia.com>
Thu, 4 Jun 2020 07:41:28 +0000 (09:41 +0200)
committerJean Perier <jperier@nvidia.com>
Thu, 4 Jun 2020 07:44:44 +0000 (09:44 +0200)
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

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

index a252a96..b6c3b20 100644 (file)
@@ -68,7 +68,7 @@ public:
       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;
     }
index 7b5a488..0e9d20b 100644 (file)
@@ -29,6 +29,11 @@ real, parameter ::  o = o
 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]