diff --git a/flang/runtime/transformational.cpp b/flang/runtime/transformational.cpp --- a/flang/runtime/transformational.cpp +++ b/flang/runtime/transformational.cpp @@ -284,6 +284,8 @@ SubscriptValue sourceAt{lb + j - 1 + shift}; if (sourceAt >= lb && sourceAt < lb + extent) { CopyElement(result, &j, source, &sourceAt, terminator); + } else if (boundary) { + CopyElement(result, &j, *boundary, 0, terminator); } } } diff --git a/flang/unittests/Runtime/Transformational.cpp b/flang/unittests/Runtime/Transformational.cpp --- a/flang/unittests/Runtime/Transformational.cpp +++ b/flang/unittests/Runtime/Transformational.cpp @@ -110,6 +110,26 @@ *result.ZeroBasedIndexedElement(j), eoshiftExpect1[j]); } result.Destroy(); + + // VECTOR EOSHIFT + StaticDescriptor<0> boundaryDescriptor; + Descriptor vectorBoundary{boundaryDescriptor.descriptor()}; + std::int32_t boundaryValue{343}; + vectorBoundary.Establish(TypeCategory::Integer, 4, + const_cast(reinterpret_cast(&boundaryValue)), 0); + RTNAME(EoshiftVector) + (vectorResult, *vector, 2, &vectorBoundary, __FILE__, __LINE__); + EXPECT_EQ(vectorResult.type(), array->type()); + EXPECT_EQ(vectorResult.rank(), 1); + EXPECT_EQ(vectorResult.GetDimension(0).LowerBound(), 1); + EXPECT_EQ(vectorResult.GetDimension(0).Extent(), 6); + EXPECT_EQ(vectorResult.type(), (TypeCode{TypeCategory::Integer, 4})); + static std::int32_t eoshiftVectorExpect[6]{3, 4, 5, 6, 343, 343}; + for (int j{0}; j < 6; ++j) { + EXPECT_EQ(*vectorResult.ZeroBasedIndexedElement(j), + eoshiftVectorExpect[j]); + } + vectorResult.Destroy(); } TEST(Transformational, Pack) {