diff --git a/flang/runtime/stop.h b/flang/runtime/stop.h --- a/flang/runtime/stop.h +++ b/flang/runtime/stop.h @@ -18,9 +18,11 @@ // Program-initiated image stop NORETURN void RTNAME(StopStatement)(int code DEFAULT_VALUE(EXIT_SUCCESS), bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false)); -NORETURN void RTNAME(StopStatementText)(const char *, +NORETURN void RTNAME(StopStatementText)(const char *, size_t, bool isErrorStop DEFAULT_VALUE(false), bool quiet DEFAULT_VALUE(false)); void RTNAME(PauseStatement)(NO_ARGUMENTS); +void RTNAME(PauseStatementInt)(int); +void RTNAME(PauseStatementText)(const char *, size_t); NORETURN void RTNAME(FailImageStatement)(NO_ARGUMENTS); NORETURN void RTNAME(ProgramEndStatement)(NO_ARGUMENTS); diff --git a/flang/runtime/stop.cpp b/flang/runtime/stop.cpp --- a/flang/runtime/stop.cpp +++ b/flang/runtime/stop.cpp @@ -64,26 +64,53 @@ } [[noreturn]] void RTNAME(StopStatementText)( - const char *code, bool isErrorStop, bool quiet) { + const char *code, std::size_t length, bool isErrorStop, bool quiet) { CloseAllExternalUnits("STOP statement"); if (!quiet) { - std::fprintf( - stderr, "Fortran %s: %s\n", isErrorStop ? "ERROR STOP" : "STOP", code); + std::fprintf(stderr, "Fortran %s: %.*s\n", + isErrorStop ? "ERROR STOP" : "STOP", static_cast(length), code); DescribeIEEESignaledExceptions(); } std::exit(EXIT_FAILURE); } -void RTNAME(PauseStatement)() { +static bool StartPause() { if (Fortran::runtime::io::IsATerminal(0)) { Fortran::runtime::io::IoErrorHandler handler{"PAUSE statement"}; Fortran::runtime::io::ExternalFileUnit::FlushAll(handler); + return true; + } + return false; +} + +static void EndPause() { + std::fflush(nullptr); + if (std::fgetc(stdin) == EOF) { + CloseAllExternalUnits("PAUSE statement"); + std::exit(EXIT_SUCCESS); + } +} + +void RTNAME(PauseStatement)() { + if (StartPause()) { std::fputs("Fortran PAUSE: hit RETURN to continue:", stderr); - std::fflush(nullptr); - if (std::fgetc(stdin) == EOF) { - CloseAllExternalUnits("PAUSE statement"); - std::exit(EXIT_SUCCESS); - } + EndPause(); + } +} + +void RTNAME(PauseStatementInt)(int code) { + if (StartPause()) { + std::fprintf(stderr, "Fortran PAUSE %d: hit RETURN to continue:", code); + EndPause(); + } +} + +void RTNAME(PauseStatementText)(const char *code, std::size_t length) { + if (StartPause()) { + std::fprintf(stderr, + "Fortran PAUSE %.*s: hit RETURN to continue:", static_cast(length), + code); + EndPause(); } }