diff --git a/flang/include/flang/Evaluate/initial-image.h b/flang/include/flang/Evaluate/initial-image.h --- a/flang/include/flang/Evaluate/initial-image.h +++ b/flang/include/flang/Evaluate/initial-image.h @@ -49,6 +49,8 @@ bytes != x.values().size() * static_cast(*elementBytes)) { return SizeMismatch; + } else if (bytes == 0) { + return Ok; } else { std::memcpy(&data_.at(offset), &x.values().at(0), bytes); return Ok; @@ -66,6 +68,8 @@ auto elementBytes{bytes > 0 ? bytes / elements : 0}; if (elements * elementBytes != bytes) { return SizeMismatch; + } else if (bytes == 0) { + return Ok; } else { for (auto at{x.lbounds()}; elements-- > 0; x.IncrementSubscripts(at)) { auto scalar{x.At(at)}; // this is a std string; size() in chars @@ -76,7 +80,7 @@ (scalarBytes > elementBytes && elements != 0)) { return SizeMismatch; } - std::memcpy(&data_[offset], scalar.data(), elementBytes); + std::memcpy(&data_.at(offset), scalar.data(), elementBytes); offset += elementBytes; } return Ok; diff --git a/flang/lib/Evaluate/initial-image.cpp b/flang/lib/Evaluate/initial-image.cpp --- a/flang/lib/Evaluate/initial-image.cpp +++ b/flang/lib/Evaluate/initial-image.cpp @@ -24,8 +24,7 @@ return SizeMismatch; } else { auto at{x.lbounds()}; - for (auto elements{TotalElementCount(x.shape())}; elements-- > 0; - x.IncrementSubscripts(at)) { + for (; elements-- > 0; x.IncrementSubscripts(at)) { auto scalar{x.At(at)}; // TODO: length type parameter values? for (const auto &[symbolRef, indExpr] : scalar) { @@ -38,7 +37,7 @@ Result added{Add(offset + component.offset(), component.size(), indExpr.value(), context)}; if (added != Ok) { - return Ok; + return added; } } }