diff options
author | Tom Tromey <tromey@redhat.com> | 2008-05-30 14:25:09 +0000 |
---|---|---|
committer | Tom Tromey <tromey@gcc.gnu.org> | 2008-05-30 14:25:09 +0000 |
commit | d750887f5f4273e10625e13d1bac1db9aeef849e (patch) | |
tree | 5c6c1e4ce1846b970214259abb76f69f5370d6be /libcpp/directives.c | |
parent | bfab40f8e5c12b8fd32dfd55a7437528def52f3e (diff) | |
download | gcc-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.c | 24 |
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. */ |