diff --git a/flang/lib/Evaluate/character.h b/flang/lib/Evaluate/character.h --- a/flang/lib/Evaluate/character.h +++ b/flang/lib/Evaluate/character.h @@ -105,7 +105,7 @@ static Character REPEAT(const Character &str, ConstantSubscript ncopies) { Character result; - if (!str.empty()) { + if (!str.empty() && ncopies > 0) { result.reserve(ncopies * str.size()); while (ncopies-- > 0) { result += str; diff --git a/flang/lib/Evaluate/fold-character.cpp b/flang/lib/Evaluate/fold-character.cpp --- a/flang/lib/Evaluate/fold-character.cpp +++ b/flang/lib/Evaluate/fold-character.cpp @@ -99,7 +99,11 @@ context, funcRef.arguments())}) { auto str{std::get>(*scalars)}; auto n{std::get>(*scalars).ToInt64()}; - if (static_cast(n) * str.size() > + if (n < 0) { + context.messages().Say( + "NCOPIES= argument to REPEAT() should be nonnegative, but is %jd"_err_en_US, + static_cast(n)); + } else if (static_cast(n) * str.size() > (1 << 20)) { // sanity limit of 1MiB context.messages().Say( "Result of REPEAT() is too large to compute at compilation time (%g characters)"_port_en_US, diff --git a/flang/test/Evaluate/errors01.f90 b/flang/test/Evaluate/errors01.f90 --- a/flang/test/Evaluate/errors01.f90 +++ b/flang/test/Evaluate/errors01.f90 @@ -148,6 +148,8 @@ subroutine s13 !CHECK: portability: Result of REPEAT() is too large to compute at compilation time (1.1259e+15 characters) print *, repeat(repeat(' ', 2**20), 2**30) + !CHECK: error: NCOPIES= argument to REPEAT() should be nonnegative, but is -666 + print *, repeat(' ', -666) end subroutine subroutine warnings real, parameter :: ok1 = scale(0.0, 99999) ! 0.0