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 @@ -72,20 +72,22 @@ } else if (bytes == 0) { return Ok; } else { + Result result{Ok}; for (auto at{x.lbounds()}; elements-- > 0; x.IncrementSubscripts(at)) { auto scalar{x.At(at)}; // this is a std string; size() in chars - // Subtle: an initializer for a substring may have been - // expanded to the length of the entire string. auto scalarBytes{scalar.size() * KIND}; - if (scalarBytes < elementBytes || - (scalarBytes > elementBytes && elements != 0)) { - return SizeMismatch; + if (scalarBytes != elementBytes) { + result = SizeMismatch; + } + // Blank padding when short + for (; scalarBytes < elementBytes; scalarBytes += KIND) { + scalar += ' '; } // TODO endianness std::memcpy(&data_.at(offset), scalar.data(), elementBytes); offset += elementBytes; } - return Ok; + return result; } } } diff --git a/flang/lib/Semantics/data-to-inits.cpp b/flang/lib/Semantics/data-to-inits.cpp --- a/flang/lib/Semantics/data-to-inits.cpp +++ b/flang/lib/Semantics/data-to-inits.cpp @@ -448,6 +448,11 @@ case evaluate::InitialImage::OutOfRange: OutOfRangeError(); break; + case evaluate::InitialImage::SizeMismatch: + exprAnalyzer_.Say( + "DATA statement value '%s' for '%s' has the wrong length"_warn_en_US, + folded.AsFortran(), DescribeElement()); + break; default: CHECK(exprAnalyzer_.context().AnyFatalError()); break; diff --git a/flang/test/Semantics/data17.f90 b/flang/test/Semantics/data17.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/data17.f90 @@ -0,0 +1,11 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 +character(4) a, b, c, d, e +!WARNING: DATA statement value '"abcde"' for 'a' has the wrong length +data a(1:4)/'abcde'/ +!WARNING: DATA statement value '"abc"' for 'b' has the wrong length +data b(1:4)/'abc'/ +data c/'abcde'/ ! not a substring, conforms +data d/'abc'/ ! not a substring, conforms +!ERROR: DATA statement designator 'e(1_8:5_8)' is out of range +data e(1:5)/'xyz'/ +end