aboutsummaryrefslogtreecommitdiff
path: root/libcpp/directives.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2008-05-30 14:25:09 +0000
committerTom Tromey <tromey@gcc.gnu.org>2008-05-30 14:25:09 +0000
commitd750887f5f4273e10625e13d1bac1db9aeef849e (patch)
tree5c6c1e4ce1846b970214259abb76f69f5370d6be /libcpp/directives.c
parentbfab40f8e5c12b8fd32dfd55a7437528def52f3e (diff)
downloadgcc-d750887f5f4273e10625e13d1bac1db9aeef849e.zip
gcc-d750887f5f4273e10625e13d1bac1db9aeef849e.tar.gz
gcc-d750887f5f4273e10625e13d1bac1db9aeef849e.tar.bz2
re PR preprocessor/36320 (Required diagnosis of syntax error missed)
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. From-SVN: r136209
Diffstat (limited to 'libcpp/directives.c')
-rw-r--r--libcpp/directives.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 8e7778d..370f4ff 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. */