re PR preprocessor/34602 (Internal error with invalid #line directive)
authorTom Tromey <tromey@redhat.com>
Thu, 3 Jan 2008 17:58:26 +0000 (17:58 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 3 Jan 2008 17:58:26 +0000 (17:58 +0000)
libcpp
PR preprocessor/34602.
* directives.c (do_line): Don't try to spell EOF token.
(do_linemarker): Add comment.
gcc/testsuite
PR preprocessor/34602:
* gcc.dg/cpp/pr34602.c: New file.

From-SVN: r131304

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/pr34602.c [new file with mode: 0644]
libcpp/ChangeLog
libcpp/directives.c

index abf7969..962dc97 100644 (file)
@@ -1,3 +1,8 @@
+2008-01-03  Tom Tromey  <tromey@redhat.com>
+
+       PR preprocessor/34602:
+       * gcc.dg/cpp/pr34602.c: New file.
+
 2008-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/29484
diff --git a/gcc/testsuite/gcc.dg/cpp/pr34602.c b/gcc/testsuite/gcc.dg/cpp/pr34602.c
new file mode 100644 (file)
index 0000000..343c091
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR preprocessor/34602 - no internal error trying to spell EOF.  */
+/* { dg-do preprocess } */
+
+/* { dg-error "unexpected end" "" { target *-*-* } 6 } */
+
+#line
index 217294a..335686f 100644 (file)
@@ -1,3 +1,9 @@
+2008-01-03  Tom Tromey  <tromey@redhat.com>
+
+       PR preprocessor/34602.
+       * directives.c (do_line): Don't try to spell EOF token.
+       (do_linemarker): Add comment.
+
 2007-12-11  DJ Delorie  <dj@redhat.com>
 
        * charset.c (convert_using_iconv): Close out any shift states,
index e8516e0..6e2e55c 100644 (file)
@@ -1,7 +1,7 @@
 /* CPP Library. (Directive handling.)
    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
    1999, 2000, 2001, 2002, 2003, 2004, 2005,
-   2007 Free Software Foundation, Inc.
+   2007, 2008 Free Software Foundation, Inc.
    Contributed by Per Bothner, 1994-95.
    Based on CCCP program by Paul Rubin, June 1986
    Adapted to ANSI C, Richard Stallman, Jan 1987
@@ -864,9 +864,12 @@ do_line (cpp_reader *pfile)
       || strtoul_for_line (token->val.str.text, token->val.str.len,
                           &new_lineno))
     {
-      cpp_error (pfile, CPP_DL_ERROR,
-                "\"%s\" after #line is not a positive integer",
-                cpp_token_as_text (pfile, token));
+      if (token->type == CPP_EOF)
+       cpp_error (pfile, CPP_DL_ERROR, "unexpected end of file after #line");
+      else
+       cpp_error (pfile, CPP_DL_ERROR,
+                  "\"%s\" after #line is not a positive integer",
+                  cpp_token_as_text (pfile, token));
       return;
     }
 
@@ -920,6 +923,8 @@ do_linemarker (cpp_reader *pfile)
       || strtoul_for_line (token->val.str.text, token->val.str.len,
                           &new_lineno))
     {
+      /* Unlike #line, there does not seem to be a way to get an EOF
+        here.  So, it should be safe to always spell the token.  */
       cpp_error (pfile, CPP_DL_ERROR,
                 "\"%s\" after # is not a positive integer",
                 cpp_token_as_text (pfile, token));