diff options
author | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-30 14:25:09 +0000 |
---|---|---|
committer | tromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-05-30 14:25:09 +0000 |
commit | 536a48ee34f51eb42e2130b46210d7976d343303 (patch) | |
tree | 5c6c1e4ce1846b970214259abb76f69f5370d6be | |
parent | e7b454ed4300c286ef1c10209caf47792330c374 (diff) | |
download | gcc-536a48ee34f51eb42e2130b46210d7976d343303.tar.gz |
gcc/testsuite
PR preprocessor/36320:
* gcc.dg/cpp/pr36320.c: New file.
libcpp
PR preprocessor/36320:
* internal.h (_cpp_parse_expr): Update.
* expr.c (_cpp_parse_expr): Add 'is_if' argument. Update error
messages.
* directives.c (do_if): Update.
(do_elif): Require expression if processing group.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136209 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/cpp/pr36320.c | 8 | ||||
-rw-r--r-- | libcpp/ChangeLog | 9 | ||||
-rw-r--r-- | libcpp/directives.c | 24 | ||||
-rw-r--r-- | libcpp/expr.c | 7 | ||||
-rw-r--r-- | libcpp/internal.h | 2 |
6 files changed, 43 insertions, 12 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bc5c61433ab..6a5083a3309 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-05-30 Tom Tromey <tromey@redhat.com> + + PR preprocessor/36320: + * gcc.dg/cpp/pr36320.c: New file. + 2008-05-29 Paolo Carlini <paolo.carlini@oracle.com> PR c++/35243 diff --git a/gcc/testsuite/gcc.dg/cpp/pr36320.c b/gcc/testsuite/gcc.dg/cpp/pr36320.c new file mode 100644 index 00000000000..d136a69b6b2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/pr36320.c @@ -0,0 +1,8 @@ +/* PR 36320 - #elif still requires valid expression. */ + +/* { dg-do preprocess } */ + +int z; +#if 1 +#elif /* { dg-error "with no expression" } */ +#endif diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 6df683eee91..3935dff57ac 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,12 @@ +2008-05-30 Tom Tromey <tromey@redhat.com> + + PR preprocessor/36320: + * internal.h (_cpp_parse_expr): Update. + * expr.c (_cpp_parse_expr): Add 'is_if' argument. Update error + messages. + * directives.c (do_if): Update. + (do_elif): Require expression if processing group. + 2008-05-30 Danny Smith <dannysmith@users.sourceforge.net> * include/cpplib.h (struct cpp_dir): Add new field, canonical_name. diff --git a/libcpp/directives.c b/libcpp/directives.c index 8e7778d12e2..370f4ff5b0d 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -1737,7 +1737,7 @@ do_if (cpp_reader *pfile) int skip = 1; if (! pfile->state.skipping) - skip = _cpp_parse_expr (pfile) == false; + skip = _cpp_parse_expr (pfile, true) == false; push_conditional (pfile, skip, T_IF, pfile->mi_ind_cmacro); } @@ -1796,15 +1796,23 @@ do_elif (cpp_reader *pfile) } ifs->type = T_ELIF; - /* Only evaluate this if we aren't skipping elses. During - evaluation, set skipping to false to get lexer warnings. */ - if (ifs->skip_elses) - pfile->state.skipping = 1; - else + if (! ifs->was_skipping) { + bool value; + /* The standard mandates that the expression be parsed even + if we are skipping elses at this point -- the lexical + restrictions on #elif only apply to skipped groups, but + this group is not being skipped. Temporarily set + skipping to false to get lexer warnings. */ pfile->state.skipping = 0; - pfile->state.skipping = ! _cpp_parse_expr (pfile); - ifs->skip_elses = ! pfile->state.skipping; + value = _cpp_parse_expr (pfile, false); + if (ifs->skip_elses) + pfile->state.skipping = 1; + else + { + pfile->state.skipping = ! value; + ifs->skip_elses = value; + } } /* Invalidate any controlling macro. */ diff --git a/libcpp/expr.c b/libcpp/expr.c index 2e52617a656..c0e3cbd8006 100644 --- a/libcpp/expr.c +++ b/libcpp/expr.c @@ -852,7 +852,7 @@ static const struct cpp_operator stored in the 'value' field of the stack element of the operator that precedes it. */ bool -_cpp_parse_expr (cpp_reader *pfile) +_cpp_parse_expr (cpp_reader *pfile, bool is_if) { struct op *top = pfile->op_stack; unsigned int lex_count; @@ -927,7 +927,7 @@ _cpp_parse_expr (cpp_reader *pfile) SYNTAX_ERROR ("missing expression between '(' and ')'"); if (op.op == CPP_EOF && top->op == CPP_EOF) - SYNTAX_ERROR ("#if with no expression"); + SYNTAX_ERROR2 ("%s with no expression", is_if ? "#if" : "#elif"); if (top->op != CPP_EOF && top->op != CPP_OPEN_PAREN) SYNTAX_ERROR2 ("operator '%s' has no right operand", @@ -988,7 +988,8 @@ _cpp_parse_expr (cpp_reader *pfile) if (top != pfile->op_stack) { - cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in #if"); + cpp_error (pfile, CPP_DL_ICE, "unbalanced stack in %s", + is_if ? "#if" : "#elif"); syntax_error: return false; /* Return false on syntax error. */ } diff --git a/libcpp/internal.h b/libcpp/internal.h index 187b31140f3..65cac325186 100644 --- a/libcpp/internal.h +++ b/libcpp/internal.h @@ -557,7 +557,7 @@ extern bool _cpp_read_file_entries (cpp_reader *, FILE *); extern struct stat *_cpp_get_file_stat (_cpp_file *); /* In expr.c */ -extern bool _cpp_parse_expr (cpp_reader *); +extern bool _cpp_parse_expr (cpp_reader *, bool); extern struct op *_cpp_expand_op_stack (cpp_reader *); /* In lex.c */ |