diff --git a/flang/lib/Evaluate/shape.cpp b/flang/lib/Evaluate/shape.cpp index ac4811e9978eb..776866d1416d2 100644 --- a/flang/lib/Evaluate/shape.cpp +++ b/flang/lib/Evaluate/shape.cpp @@ -1073,8 +1073,8 @@ auto GetShapeHelper::operator()(const ProcedureRef &call) const -> Result { } } } else if (intrinsic->name == "spread") { - // SHAPE(SPREAD(ARRAY,DIM,NCOPIES)) = SHAPE(ARRAY) with NCOPIES inserted - // at position DIM. + // SHAPE(SPREAD(ARRAY,DIM,NCOPIES)) = SHAPE(ARRAY) with MAX(0,NCOPIES) + // inserted at position DIM. if (call.arguments().size() == 3) { auto arrayShape{ (*this)(UnwrapExpr>(call.arguments().at(0)))}; @@ -1086,7 +1086,8 @@ auto GetShapeHelper::operator()(const ProcedureRef &call) const -> Result { if (*dim >= 1 && static_cast(*dim) <= arrayShape->size() + 1) { arrayShape->emplace(arrayShape->begin() + *dim - 1, - ConvertToType(common::Clone(*nCopies))); + Extremum{Ordering::Greater, ExtentExpr{0}, + ConvertToType(common::Clone(*nCopies))}); return std::move(*arrayShape); } } diff --git a/flang/test/Evaluate/fold-spread.f90 b/flang/test/Evaluate/fold-spread.f90 index b7e493ee061c8..c8b87e8c87811 100644 --- a/flang/test/Evaluate/fold-spread.f90 +++ b/flang/test/Evaluate/fold-spread.f90 @@ -12,4 +12,5 @@ module m1 logical, parameter :: test_log4 = all(any(spread([.false., .true.], 2, 2), dim=2) .eqv. [.false., .true.]) logical, parameter :: test_m2toa3 = all(spread(reshape([(j,j=1,6)],[2,3]),1,4) == & reshape([((j,k=1,4),j=1,6)],[4,2,3])) + logical, parameter :: test_shape_neg = all(shape(spread(0,1,-1)) == [0]) end module