]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR preprocessor/30786 (ICE on _Pragma at end of file)
authorTom Tromey <tromey@redhat.com>
Wed, 31 Oct 2007 14:50:13 +0000 (14:50 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 31 Oct 2007 14:50:13 +0000 (14:50 +0000)
gcc/testsuite
PR preprocessor/30786:
* gcc.dg/cpp/pr30786.c: New file.
libcpp
PR preprocessor/30786:
* macro.c (builtin_macro): Return result of _cpp_do__Pragma.
* directives.c (_cpp_do__Pragma): Return error status.
* internal.h (_cpp_do__Pragma): Update.
* directives.c (get__Pragma_string): Back up if EOF seen.

From-SVN: r129800

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

index b9307a17ee6e1c3f50393115a9066dbd7aa6417a..46dcd8ff808805f08124a4a88b85d6b30acaf391 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-31  Tom Tromey  <tromey@redhat.com>
+
+       PR preprocessor/30786:
+       * gcc.dg/cpp/pr30786.c: New file.
+
 2007-10-31  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/33162
diff --git a/gcc/testsuite/gcc.dg/cpp/pr30786.c b/gcc/testsuite/gcc.dg/cpp/pr30786.c
new file mode 100644 (file)
index 0000000..f39f83c
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR preprocessor/30786 - _Pragma at end of file should not ICE */
+/* { dg-do compile } */
+
+/* { dg-error "parenthesized" "" { target *-*-* } 9 } */
+/* { dg-error "expected" "" { target *-*-* } 9 } */
+
+int x;
+
+_Pragma
index 08e5f86af1ed8723b1ee6134975bd0e3fabaec0f..beed40746faa4258b0acff8a8531ad81933d9850 100644 (file)
@@ -1,3 +1,11 @@
+2007-10-31  Tom Tromey  <tromey@redhat.com>
+
+       PR preprocessor/30786:
+       * macro.c (builtin_macro): Return result of _cpp_do__Pragma.
+       * directives.c (_cpp_do__Pragma): Return error status.
+       * internal.h (_cpp_do__Pragma): Update.
+       * directives.c (get__Pragma_string): Back up if EOF seen.
+
 2007-09-06  Tom Tromey  <tromey@redhat.com>
 
        * internal.h (struct cpp_reader) <invocation_location>: New
index 7f7216265c922d208414ef42d0d9d33ed12dc32d..e8516e0f39c3fbe96d2edf2d5f4ceeb55e70c679 100644 (file)
@@ -1467,15 +1467,24 @@ static const cpp_token *
 get__Pragma_string (cpp_reader *pfile)
 {
   const cpp_token *string;
+  const cpp_token *paren;
 
-  if (get_token_no_padding (pfile)->type != CPP_OPEN_PAREN)
+  paren = get_token_no_padding (pfile);
+  if (paren->type == CPP_EOF)
+    _cpp_backup_tokens (pfile, 1);
+  if (paren->type != CPP_OPEN_PAREN)
     return NULL;
 
   string = get_token_no_padding (pfile);
+  if (string->type == CPP_EOF)
+    _cpp_backup_tokens (pfile, 1);
   if (string->type != CPP_STRING && string->type != CPP_WSTRING)
     return NULL;
 
-  if (get_token_no_padding (pfile)->type != CPP_CLOSE_PAREN)
+  paren = get_token_no_padding (pfile);
+  if (paren->type == CPP_EOF)
+    _cpp_backup_tokens (pfile, 1);
+  if (paren->type != CPP_CLOSE_PAREN)
     return NULL;
 
   return string;
@@ -1595,18 +1604,21 @@ destringize_and_run (cpp_reader *pfile, const cpp_string *in)
   _cpp_push_token_context (pfile, NULL, toks, count);
 }
 
-/* Handle the _Pragma operator.  */
-void
+/* Handle the _Pragma operator.  Return 0 on error, 1 if ok.  */
+int
 _cpp_do__Pragma (cpp_reader *pfile)
 {
   const cpp_token *string = get__Pragma_string (pfile);
   pfile->directive_result.type = CPP_PADDING;
 
   if (string)
-    destringize_and_run (pfile, &string->val.str);
-  else
-    cpp_error (pfile, CPP_DL_ERROR,
-              "_Pragma takes a parenthesized string literal");
+    {
+      destringize_and_run (pfile, &string->val.str);
+      return 1;
+    }
+  cpp_error (pfile, CPP_DL_ERROR,
+            "_Pragma takes a parenthesized string literal");
+  return 0;
 }
 
 /* Handle #ifdef.  */
index 59332df4fe364d4999552596f30d5c5e53492b8b..830f07bf3a896d1645c5bc18177392ce500da3a8 100644 (file)
@@ -576,7 +576,7 @@ extern int _cpp_handle_directive (cpp_reader *, int);
 extern void _cpp_define_builtin (cpp_reader *, const char *);
 extern char ** _cpp_save_pragma_names (cpp_reader *);
 extern void _cpp_restore_pragma_names (cpp_reader *, char **);
-extern void _cpp_do__Pragma (cpp_reader *);
+extern int _cpp_do__Pragma (cpp_reader *);
 extern void _cpp_init_directives (cpp_reader *);
 extern void _cpp_init_internal_pragmas (cpp_reader *);
 extern void _cpp_do_file_change (cpp_reader *, enum lc_reason, const char *,
index e80815b7bf2bad272532013119236d02d7418646..50bb34ded5f86fe4338147ff0e8478b64f577a56 100644 (file)
@@ -300,8 +300,7 @@ builtin_macro (cpp_reader *pfile, cpp_hashnode *node)
       if (pfile->state.in_directive)
        return 0;
 
-      _cpp_do__Pragma (pfile);
-      return 1;
+      return _cpp_do__Pragma (pfile);
     }
 
   buf = _cpp_builtin_macro_text (pfile, node);