From 456b8ce5dbc2f77b3506d18c7eaec25cf76cb573 Mon Sep 17 00:00:00 2001
From: Uros Bizjak <uros@gcc.gnu.org>
Date: Wed, 9 Nov 2005 07:30:03 +0100
Subject: [PATCH] re PR c/24101 (Segfault with preprocessed source)

libcpp/

	PR c/24101
	* init.c (read_original_filename): Temporarily set
	state.in_directive before calling _cpp_lex_direct for
	CPP_HASH tokens.

gcc/

	PR c/24101
	* toplev.c (process_options): Initialize debug_hooks early
	in case lang_hooks.post_options ends up calling a debug_hook.

gcc/testsuite/

	PR c/24101
	* gcc.dg/pr24101-1.i, gcc.dg/pr24101-2.i: New tests.
	* gcc.dg/dg.exp: Run main loop also for *.i files.

From-SVN: r106677
---
 gcc/ChangeLog                    | 7 +++++++
 gcc/testsuite/ChangeLog          | 6 ++++++
 gcc/testsuite/gcc.dg/dg.exp      | 2 +-
 gcc/testsuite/gcc.dg/pr24101-1.i | 4 ++++
 gcc/testsuite/gcc.dg/pr24101-2.i | 4 ++++
 gcc/toplev.c                     | 5 ++++-
 libcpp/ChangeLog                 | 8 ++++++++
 libcpp/init.c                    | 2 ++
 8 files changed, 36 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/pr24101-1.i
 create mode 100644 gcc/testsuite/gcc.dg/pr24101-2.i

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5e86d193a40b..c9836318d76e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2005-11-09  Per Bothner  <per@bothner.com>
+	    Uros Bizjak  <uros@kss-loka.si>
+	
+	PR c/24101
+	* toplev.c (process_options): Initialize debug_hooks early
+	in case lang_hooks.post_options ends up calling a debug_hook.
+
 2005-11-08  Jakub Jelinek  <jakub@redhat.com>
 
 	* dwarf2out.c (multiple_reg_loc_descriptor): Don't assume
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8058bb84e5c0..d0bd89e28e8c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-09  Uros Bizjak  <uros@kss-loka.si>
+
+	PR c/24101
+	* gcc.dg/pr24101-1.i, gcc.dg/pr24101-2.i: New tests.
+	* gcc.dg/dg.exp: Run main loop also for *.i files.
+
 2005-11-08  Jakub Jelinek  <jakub@redhat.com>
 
 	PR c++/19450
diff --git a/gcc/testsuite/gcc.dg/dg.exp b/gcc/testsuite/gcc.dg/dg.exp
index 00b26d6e394e..826bcf3f3a5e 100644
--- a/gcc/testsuite/gcc.dg/dg.exp
+++ b/gcc/testsuite/gcc.dg/dg.exp
@@ -29,7 +29,7 @@ if ![info exists DEFAULT_CFLAGS] then {
 dg-init
 
 # Main loop.
-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cSi\]]] \
 	"" $DEFAULT_CFLAGS
 
 # All done.
diff --git a/gcc/testsuite/gcc.dg/pr24101-1.i b/gcc/testsuite/gcc.dg/pr24101-1.i
new file mode 100644
index 000000000000..45c165539b61
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr24101-1.i
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-ansi" } */
+
+# 1 "/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.0/include/stddef.h" 1 3 4
diff --git a/gcc/testsuite/gcc.dg/pr24101-2.i b/gcc/testsuite/gcc.dg/pr24101-2.i
new file mode 100644
index 000000000000..501382da4b68
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr24101-2.i
@@ -0,0 +1,4 @@
+/* { dg-do compile } */
+/* { dg-options "-ansi" } */
+
+#
diff --git a/gcc/toplev.c b/gcc/toplev.c
index eea9ab20ead6..b03e91dc9994 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1493,6 +1493,10 @@ general_init (const char *argv0)
 static void
 process_options (void)
 {
+  /* Just in case lang_hooks.post_options ends up calling a debug_hook.
+     This can happen with incorrect pre-processed input. */
+  debug_hooks = &do_nothing_debug_hooks;
+
   /* Allow the front end to perform consistency checks and do further
      initialization based on the command line options.  This hook also
      sets the original filename if appropriate (e.g. foo.i -> foo.c)
@@ -1652,7 +1656,6 @@ process_options (void)
     default_debug_hooks = &vmsdbg_debug_hooks;
 #endif
 
-  debug_hooks = &do_nothing_debug_hooks;
   if (write_symbols == NO_DEBUG)
     ;
 #if defined(DBX_DEBUGGING_INFO)
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 3b14dabf1343..747e45adc72e 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,11 @@
+2005-11-09  Per Bothner  <per@bothner.com>
+	    Uros Bizjak  <uros@kss-loka.si>
+	
+	PR c/24101
+	* init.c (read_original_filename): Temporarily set
+	state.in_directive before calling _cpp_lex_direct for
+	CPP_HASH tokens.
+
 2005-11-03  James E Wilson  <wilson@specifix.com>
 
 	PR preprocessor/24202
diff --git a/libcpp/init.c b/libcpp/init.c
index 3074f96b5c8b..bbf2705b46c4 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -497,8 +497,10 @@ read_original_filename (cpp_reader *pfile)
   token = _cpp_lex_direct (pfile);
   if (token->type == CPP_HASH)
     {
+      pfile->state.in_directive = 1;
       token1 = _cpp_lex_direct (pfile);
       _cpp_backup_tokens (pfile, 1);
+      pfile->state.in_directive = 0;
 
       /* If it's a #line directive, handle it.  */
       if (token1->type == CPP_NUMBER)
-- 
GitLab