From: Peter Klausler Date: Thu, 18 Aug 2022 17:31:13 +0000 (-0700) Subject: [flang][runtime] Fix return value for MINVAL/MAXVAL for CHARACTER(kind > 1) X-Git-Tag: upstream/17.0.6~36090 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cd117fa04b620c9ce4d63ca4d475aa3ec5a1a122;p=platform%2Fupstream%2Fllvm.git [flang][runtime] Fix return value for MINVAL/MAXVAL for CHARACTER(kind > 1) CharacterExtremumAccumulator::GetResult() needs to use byte counts, not wide character counts, when calling memcpy() & memset(). Differential Revision: https://reviews.llvm.org/D132156 --- diff --git a/flang/runtime/extrema.cpp b/flang/runtime/extrema.cpp index 709a032..8290ad3 100644 --- a/flang/runtime/extrema.cpp +++ b/flang/runtime/extrema.cpp @@ -419,11 +419,16 @@ public: void Reinitialize() { extremum_ = nullptr; } template void GetResult(A *p, int /*zeroBasedDim*/ = -1) const { static_assert(std::is_same_v); + std::size_t byteSize{array_.ElementBytes()}; if (extremum_) { - std::memcpy(p, extremum_, charLen_); + std::memcpy(p, extremum_, byteSize); } else { - // empty array: result is all zero-valued characters - std::memset(p, 0, charLen_); + // empty array + if constexpr (KIND == 1) { // ASCII + *p = IS_MAXVAL ? 0 : 127; // 127 required by standard + } else { + std::memset(p, IS_MAXVAL ? 0 : 255, byteSize); + } } } bool Accumulate(const Type *x) {