From d750887f5f4273e10625e13d1bac1db9aeef849e Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Fri, 30 May 2008 14:25:09 +0000 Subject: 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 --- libcpp/directives.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'libcpp/directives.c') 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. */ -- cgit v1.1