diff --git a/gcc/cobol/UAT/failsuite.src/run_functions.at b/gcc/cobol/UAT/failsuite.src/run_functions.at index b616ddec6ede790075c71ff8dedf3ba121bd8f5d..5a5319dfc5051b7571ed4d52f2a77126c86865ba 100644 --- a/gcc/cobol/UAT/failsuite.src/run_functions.at +++ b/gcc/cobol/UAT/failsuite.src/run_functions.at @@ -85,20 +85,31 @@ AT_DATA([prog.cob], [ STOP RUN. ]) -AT_CHECK([$COMPILE prog.cob], [0], [], -[prog.cob:11: warning: FUNCTION 'FORMATTED-CURRENT-DATE' has format in variable -prog.cob:18: warning: FUNCTION 'FORMATTED-DATE' has format in variable -prog.cob:24: warning: FUNCTION 'FORMATTED-DATETIME' has format in variable -prog.cob:31: warning: FUNCTION 'FORMATTED-TIME' has format in variable -prog.cob:37: warning: FUNCTION 'INTEGER-OF-FORMATTED-DATE' has format in variable -prog.cob:44: warning: FUNCTION 'SECONDS-FROM-FORMATTED-TIME' has format in variable -prog.cob:51: warning: FUNCTION 'TEST-FORMATTED-DATETIME' has format in variable +AT_CHECK([$COMPILE prog.cob], [1], [], +[prog.cob:12: error: format must be literal at 'invalid-date-format' +prog.cob:12: syntax error at 'invalid-date-format' +prog.cob:16: syntax error at 'END-IF' +prog.cob:18: error: format must be literal at 'invalid-date-format' +prog.cob:18: syntax error at 'invalid-date-format' +prog.cob:22: syntax error at 'END-IF' +prog.cob:25: error: format must be literal at 'invalid-datetime-format' +prog.cob:25: syntax error at 'invalid-datetime-format' +prog.cob:29: syntax error at 'END-IF' +prog.cob:31: error: format must be literal at 'invalid-time-format' +prog.cob:31: syntax error at 'invalid-time-format' +prog.cob:35: syntax error at 'END-IF' +prog.cob:38: error: format must be literal at 'invalid-date-format' +prog.cob:38: syntax error at 'invalid-date-format' +prog.cob:42: syntax error at 'END-IF' +prog.cob:45: error: format must be literal at 'invalid-time-format' +prog.cob:45: syntax error at 'invalid-time-format' +prog.cob:49: syntax error at 'END-IF' +prog.cob:52: error: format must be literal at 'invalid-datetime-format' +prog.cob:52: syntax error at 'invalid-datetime-format' +prog.cob:56: syntax error at 'END-IF' +cobol1: error: failed compiling prog.cob ]) -# running the program -AT_CHECK([$COBCRUN_DIRECT ./a.out], [0], [], []) - - AT_CLEANUP @@ -115,9 +126,9 @@ AT_DATA([prog.cob], [ MOVE E TO Z. STOP RUN. ]) -AT_CHECK([$COMPILE prog.cob], [1], [], [prog.cob:8: syntax error: symbol 'PI' not found at 'TO' -prog.cob:9: syntax error: symbol 'E' not found at 'TO' -prog.cob:10: syntax error: symbol 'E' not found at 'TO' +AT_CHECK([$COMPILE prog.cob], [1], [], +[prog.cob:8: error: symbol 'PI' not found at 'TO' +prog.cob:9: error: symbol 'E' not found at 'TO' cobol1: error: failed compiling prog.cob ]) AT_CLEANUP diff --git a/gcc/cobol/UAT/failsuite.src/syn_misc.at b/gcc/cobol/UAT/failsuite.src/syn_misc.at index a2fc97bcb66ccdcf2d40d5be9ddb4b8eddb90de6..74fd6908165ad2209a3dd7412486c99df7301d92 100644 --- a/gcc/cobol/UAT/failsuite.src/syn_misc.at +++ b/gcc/cobol/UAT/failsuite.src/syn_misc.at @@ -36,7 +36,11 @@ AT_DATA([prog.cob], [ X"1" END-DISPLAY. ]) -AT_CHECK([$COMPILE_ONLY prog.cob], [1], [], [Needs better error messages]) +AT_CHECK([$COMPILE_ONLY prog.cob], [1], [], [prog.cob:9: error: invalid hexadecimal value: X"GH" at 'X"GH"' +prog.cob:9: syntax error at 'X"GH"' +prog.cob:10: syntax error: hex literal '1' has an odd number (1) of characters at '1' +cobol1: error: failed compiling prog.cob +]) AT_CLEANUP diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index bdd16530de9c19804ca34c5c6693cfba35c534b8..18e4ed2d0deca875347b7a20d898b5d678f8c1d7 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -5128,7 +5128,7 @@ parser_exit(void) // Create a buffer that grows in size, as needed, to accommodate the // data that needs to be returned. -#pragma warning "Fix me" +#pragma GCC warning "Fix me: Create a buffer that grows in size" tree array_type = build_array_type_nelts(UCHAR, current_function->returning->data.capacity); diff --git a/gcc/cobol/scan.l b/gcc/cobol/scan.l index 3cdfd0f75317665a1d1dfb19bfd0c41df2b0cb64..9879dd749b2aed33338eb773bb2c55b1f9e4c734 100644 --- a/gcc/cobol/scan.l +++ b/gcc/cobol/scan.l @@ -58,6 +58,7 @@ hfc (({hpref}{hfrac}{bexp}{fsuff_opt})|({hpref}{hdseq}{bexp}{fsuff_opt})) boolseq (([''][01]+[''])|([""][01]+[""])) hexseq ((['']{hdseq}[''])|([""]{hdseq}[""])) +nonseq (([''][[:alnum:]]+][''])|([""][[:alnum:]]+[""])) INTEGER 0*[1-9][[:digit:]]* INTEGERZ [[:digit:]]+ @@ -1076,6 +1077,8 @@ USE({SPC}FOR)? { return USE; } yy_push_state(quoted2); } N?X/{hexseq} { yylval.literal.set_prefix(yytext, yyleng); yy_push_state(hex_state); } + N?X{nonseq} { yyerrorv("error: invalid hexadecimal value: %s", yytext); + return NO_CONDITION; } [[:blank:]]*\r?\n {} WORKING-STORAGE{SECTION} { return WORKING_STORAGE_SECT; } @@ -1309,6 +1312,9 @@ USE({SPC}FOR)? { return USE; } B/{boolseq} { is_not = false; yy_push_state(bool_state); } N?X/{hexseq} { yylval.literal.set_prefix(yytext, yyleng); yy_push_state(hex_state); } + N?X{nonseq} { yyerrorv("error: invalid hexadecimal value: %s", yytext); + return NO_CONDITION; } + BX/{hexseq} { yylval.numstr.radix = hexadecimal_e; yy_push_state(numstr_state); } @@ -1547,29 +1553,25 @@ USE({SPC}FOR)? { return USE; } <datetime_fmt>{ [(] { return *yytext; } - ['']{DATETIME_FMT}[''] { yylval.string = strdup(yytext + 1); - yylval.string[yyleng-2] = '\0'; - pop_return DATETIME_FMT; } + ['']{DATETIME_FMT}[''] | [""]{DATETIME_FMT}[""] { yylval.string = strdup(yytext + 1); yylval.string[yyleng-2] = '\0'; pop_return DATETIME_FMT; } - ['']{DATE_FMT}[''] { yylval.string = strdup(yytext + 1); - yylval.string[yyleng-2] = '\0'; - pop_return DATE_FMT; } + ['']{DATE_FMT}[''] | [""]{DATE_FMT}[""] { yylval.string = strdup(yytext + 1); yylval.string[yyleng-2] = '\0'; pop_return DATE_FMT; } - ['']{TIME_FMT}[''] { yylval.string = strdup(yytext + 1); - yylval.string[yyleng-2] = '\0'; - pop_return TIME_FMT; } + ['']{TIME_FMT}[''] | [""]{TIME_FMT}[""] { yylval.string = strdup(yytext + 1); yylval.string[yyleng-2] = '\0'; pop_return TIME_FMT; } {SPC} // ignore - . { return NO_CONDITION; } + {NAME} { yyerror("error: format must be literal"); + pop_return NO_CONDITION; } + . { yyless(0); pop_return NO_CONDITION; } } <function>{