summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-30 14:25:09 +0000
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-30 14:25:09 +0000
commit536a48ee34f51eb42e2130b46210d7976d343303 (patch)
tree5c6c1e4ce1846b970214259abb76f69f5370d6be
parente7b454ed4300c286ef1c10209caf47792330c374 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/cpp/pr36320.c8
-rw-r--r--libcpp/ChangeLog9
-rw-r--r--libcpp/directives.c24
-rw-r--r--libcpp/expr.c7
-rw-r--r--libcpp/internal.h2
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 */