diff options
Diffstat (limited to 'gcc/cpplib.c')
-rw-r--r-- | gcc/cpplib.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/gcc/cpplib.c b/gcc/cpplib.c index d785fcd..5c7e4e1 100644 --- a/gcc/cpplib.c +++ b/gcc/cpplib.c @@ -90,7 +90,7 @@ static int glue_header_name PARAMS ((cpp_reader *, cpp_token *)); static int parse_include PARAMS ((cpp_reader *, cpp_token *)); static void push_conditional PARAMS ((cpp_reader *, int, int, const cpp_hashnode *)); -static unsigned int read_flag PARAMS ((cpp_reader *)); +static unsigned int read_flag PARAMS ((cpp_reader *, unsigned int)); static int strtoul_for_line PARAMS ((const U_CHAR *, unsigned int, unsigned long *)); static void do_diagnostic PARAMS ((cpp_reader *, enum error_type, int)); @@ -247,14 +247,14 @@ end_directive (pfile, skip_line) { cpp_buffer *buffer = pfile->buffer; + /* Restore pfile->skipping before skip_rest_of_line, so that e.g. + __VA_ARGS__ in the rest of the directive doesn't warn. */ + pfile->skipping = buffer->was_skipping; + /* We don't skip for an assembler #. */ if (skip_line) skip_rest_of_line (pfile); - /* Restore pfile->skipping after skip_rest_of_line. Otherwise the - lexer might not return! */ - pfile->skipping = buffer->was_skipping; - /* Restore state. */ pfile->la_write = pfile->la_saved; pfile->state.save_comments = ! CPP_OPTION (pfile, discard_comments); @@ -639,22 +639,26 @@ do_include_next (pfile) _cpp_execute_include (pfile, &header, 0, 1); } -/* Subroutine of do_line. Read possible flags after file name. If it - is a number between 1 and 4, return it, otherwise return 0. If - it's not the end of the directive complain. */ +/* Subroutine of do_line. Read possible flags after file name. LAST + is the last flag seen; 0 if this is the first flag. Return the flag + if it is valid, 0 at the end of the directive. Otherwise complain. */ static unsigned int -read_flag (pfile) +read_flag (pfile, last) cpp_reader *pfile; + unsigned int last; { cpp_token token; _cpp_lex_token (pfile, &token); if (token.type == CPP_NUMBER && token.val.str.len == 1) { - unsigned int flag = token.val.str.text[0] - '1'; - if (flag <= 3) - return flag + 1; + unsigned int flag = token.val.str.text[0] - '0'; + + if (flag > last && flag <= 4 + && (flag != 4 || last == 3) + && (flag != 2 || last == 0)) + return flag; } if (token.type != CPP_EOF) @@ -733,31 +737,33 @@ do_line (pfile) _cpp_simplify_pathname (fname); buffer->nominal_fname = fname; - if (pfile->state.line_extension) + if (! pfile->state.line_extension) + check_eol (pfile); + else { - int flag, sysp = 0; + int flag = 0, sysp = 0; - flag = read_flag (pfile); + flag = read_flag (pfile, flag); if (flag == 1) { reason = FC_ENTER; - flag = read_flag (pfile); + flag = read_flag (pfile, flag); } else if (flag == 2) { reason = FC_LEAVE; - flag = read_flag (pfile); + flag = read_flag (pfile, flag); } if (flag == 3) { - flag = read_flag (pfile); sysp = 1; + flag = read_flag (pfile, flag); + if (flag == 4) + sysp = 2, read_flag (pfile, flag); } - cpp_make_system_header (pfile, sysp, flag == 4); + cpp_make_system_header (pfile, sysp, sysp == 2); } - - check_eol (pfile); } else if (token.type != CPP_EOF) { |