re PR preprocessor/36320 (Required diagnosis of syntax error missed)
authorTom Tromey <tromey@redhat.com>
Fri, 30 May 2008 14:25:09 +0000 (14:25 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Fri, 30 May 2008 14:25:09 +0000 (14:25 +0000)
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

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/pr36320.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/directives.c
libcpp/expr.c
libcpp/internal.h

index bc5c61433abcb24bccfdb3ee66b74fe96eda76a1..6a5083a3309578e43eb35caeb28cb4e934d4d192 100644 (file)
@@ -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 (file)
index 0000000..d136a69
--- /dev/null
@@ -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
index 6df683eee916b8f36988839f8ca03ace077e708d..3935dff57acc30b8f1a551d889a8ad4590129b09 100644 (file)
@@ -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.
index 8e7778d12e29fc6b2756e5dac0b5742fd3bcb50c..370f4ff5b0d3884706008bfd181173e18ede8e28 100644 (file)
@@ -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.  */
index 2e52617a6568ab09c42513b53944301019d7b0e0..c0e3cbd8006fc9345e50589462937c3e061ce9e0 100644 (file)
@@ -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.  */
     }
index 187b31140f33a2ff1d2e8c663a36f5fafcf83698..65cac325186a2b0be4c7973e2426fbbb844847e0 100644 (file)
@@ -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 */