From 201119217fd8d3eac9e19d79cddc5e00d4c72500 Mon Sep 17 00:00:00 2001 From: kiranchandramohan Date: Tue, 26 Nov 2019 21:34:03 +0000 Subject: [PATCH] [flang] Minor fix in folding of reshape intrinsic (flang-compiler/f18#842) The standard permits source to have more elements than the result (as specified by the SHAPE arg). While copying, ensure that we do not copy more than the number of elements of the result. Original-commit: flang-compiler/f18@6b8284f4f2cff32fcf5483ea93d1d239ecdacd33 Reviewed-on: https://github.com/flang-compiler/f18/pull/842 --- flang/lib/evaluate/fold.cc | 4 ++-- flang/test/evaluate/folding06.f90 | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/flang/lib/evaluate/fold.cc b/flang/lib/evaluate/fold.cc index 3e31122..de06b2c 100644 --- a/flang/lib/evaluate/fold.cc +++ b/flang/lib/evaluate/fold.cc @@ -386,8 +386,8 @@ Expr Reshape(FoldingContext &context, FunctionRef &&funcRef) { ? source->Reshape(std::move(shape.value())) : pad->Reshape(std::move(shape.value()))}; ConstantSubscripts subscripts{result.lbounds()}; - auto copied{ - result.CopyFrom(*source, source->size(), subscripts, dimOrderPtr)}; + auto copied{result.CopyFrom(*source, + std::min(source->size(), resultElements), subscripts, dimOrderPtr)}; if (copied < resultElements) { CHECK(pad); copied += result.CopyFrom( diff --git a/flang/test/evaluate/folding06.f90 b/flang/test/evaluate/folding06.f90 index 148a3fa..c4595fd 100644 --- a/flang/test/evaluate/folding06.f90 +++ b/flang/test/evaluate/folding06.f90 @@ -31,8 +31,10 @@ module m integer(4), parameter :: int_pad(2) = [7, 8] integer(4), parameter :: int_expected_result(*, *) = reshape([1, 5, 2, 6, 3, 7, 4, 8], new_shape) integer(4), parameter :: int_result(*, *) = reshape(int_source, new_shape, int_pad, order) + integer(4), parameter :: int_result_long_source(*, *) = reshape([1, 5, 2, 6, 3, 7, 4, 8, 9], new_shape) logical, parameter :: test_reshape_integer_1 = all(int_expected_result == int_result) logical, parameter :: test_reshape_integer_2 = all(shape(int_result, 8).EQ.new_shape) + logical, parameter :: test_reshape_integer_3 = all(int_expected_result == int_result_long_source) ! Testing characters -- 2.7.4