diff options
author | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2015-08-23 21:24:49 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2015-08-23 21:24:49 +0000 |
commit | 1487cca00ca6f4e0fe60d72761737da162e96840 (patch) | |
tree | 22c06ca665153780f25817897e0ceb0f60166df8 /libgfortran | |
parent | ac9521817d7bb373be797d0181188f29ff4ab2a0 (diff) | |
download | gcc-1487cca00ca6f4e0fe60d72761737da162e96840.tar.gz |
re PR libfortran/62296 (EXECUTE_COMMAND_LINE not F2008 conforming)
PR libfortran/62296
* intrinsics/execute_command_line.c (EXEC_INVALIDCOMMAND): New
error code.
(cmdmsg_values): New error message.
(set_cmdstat): Rework runtime error.
(execute_command_line): Handle invalid command line error status.
* gfortran.dg/execute_command_line_2.f90: New test.
From-SVN: r227105
Diffstat (limited to 'libgfortran')
-rw-r--r-- | libgfortran/ChangeLog | 11 | ||||
-rw-r--r-- | libgfortran/intrinsics/execute_command_line.c | 21 |
2 files changed, 28 insertions, 4 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2206c7fe35e..9ffaa035b60 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,7 +1,16 @@ +2015-08-23 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> + + PR libfortran/62296 + * intrinsics/execute_command_line.c (EXEC_INVALIDCOMMAND): New + error code. + (cmdmsg_values): New error message. + (set_cmdstat): Rework runtime error. + (execute_command_line): Handle invalid command line error status. + 2015-08-10 Steven G. Kargl <kargl@gcc.gnu.org> PR libfortran/67140 - * intrinsics/mvbits.c: Fix build for paltforms without c_int128_t. + * intrinsics/mvbits.c: Fix build for platforms without c_int128_t. 2015-08-10 Steven G. Kargl <kargl@gcc.gnu.org> diff --git a/libgfortran/intrinsics/execute_command_line.c b/libgfortran/intrinsics/execute_command_line.c index 404314b0952..5af9efd7946 100644 --- a/libgfortran/intrinsics/execute_command_line.c +++ b/libgfortran/intrinsics/execute_command_line.c @@ -36,11 +36,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see enum { EXEC_SYNCHRONOUS = -2, EXEC_NOERROR = 0, EXEC_SYSTEMFAILED, - EXEC_CHILDFAILED }; + EXEC_CHILDFAILED, EXEC_INVALIDCOMMAND }; static const char *cmdmsg_values[] = { "", "Termination status of the command-language interpreter cannot be obtained", - "Execution of child process impossible" }; + "Execution of child process impossible", + "Invalid command line" }; @@ -50,7 +51,12 @@ set_cmdstat (int *cmdstat, int value) if (cmdstat) *cmdstat = value; else if (value > EXEC_NOERROR) - runtime_error ("Could not execute command line"); + { +#define MSGLEN 200 + char msg[MSGLEN] = "EXECUTE_COMMAND_LINE: "; + strncat (msg, cmdmsg_values[value], MSGLEN - strlen(msg) - 1); + runtime_error (msg); + } } @@ -95,6 +101,15 @@ execute_command_line (const char *command, bool wait, int *exitstat, else if (!wait) set_cmdstat (cmdstat, EXEC_SYNCHRONOUS); #endif + else if (res == 127 || res == 126 +#if defined(WEXITSTATUS) && defined(WIFEXITED) + || (WIFEXITED(res) && WEXITSTATUS(res) == 127) + || (WIFEXITED(res) && WEXITSTATUS(res) == 126) +#endif + ) + /* Shell return codes 126 and 127 mean that the command line could + not be executed for various reasons. */ + set_cmdstat (cmdstat, EXEC_INVALIDCOMMAND); else set_cmdstat (cmdstat, EXEC_NOERROR); |