From 705e2d28a1c830064e0bc77fd7e37f7e73b01516 Mon Sep 17 00:00:00 2001
From: Tom Tromey <tromey@redhat.com>
Date: Thu, 4 Jan 2007 15:32:26 +0000
Subject: [PATCH] re PR preprocessor/28165 (_Pragma GCC system_header broken)

libcpp
	PR preprocessor/28165:
	* internal.h (cpp_in_primary_file): New function.
	* directives.c (do_include_next): Use cpp_in_primary_file.
	(do_pragma_once): Likewise.
	(do_pragma_system_header): Likewise.
gcc/testsuite
	PR preprocessor/28165:
	* gcc.dg/cpp/pr28165.c: New file.

From-SVN: r120441
---
 gcc/testsuite/ChangeLog            |  5 +++++
 gcc/testsuite/gcc.dg/cpp/pr28165.c |  6 ++++++
 libcpp/ChangeLog                   |  8 ++++++++
 libcpp/directives.c                | 11 +++++------
 libcpp/internal.h                  |  9 ++++++++-
 5 files changed, 32 insertions(+), 7 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/cpp/pr28165.c

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 240666861916..0663f79bb8e5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-01-04  Tom Tromey  <tromey@redhat.com>
+
+	PR preprocessor/28165:
+	* gcc.dg/cpp/pr28165.c: New file.
+
 2007-01-03  Josh Conner  <jconner@apple.com>
 
 	PR middle-end/29683
diff --git a/gcc/testsuite/gcc.dg/cpp/pr28165.c b/gcc/testsuite/gcc.dg/cpp/pr28165.c
new file mode 100644
index 000000000000..71c7c1dba462
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/cpp/pr28165.c
@@ -0,0 +1,6 @@
+/* Copyright (C) 2007 Free Software Foundation, Inc.  */
+/* PR preprocessor/28165 */
+
+/* { dg-do preprocess } */
+#pragma GCC system_header   /* { dg-warning "system_header" "ignored" } */
+_Pragma ("GCC system_header")   /* { dg-warning "system_header" "ignored" } */
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 96c5140e7077..072c6aadbb99 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -1,3 +1,11 @@
+2007-01-04  Tom Tromey  <tromey@redhat.com>
+
+	PR preprocessor/28165:
+	* internal.h (cpp_in_primary_file): New function.
+	* directives.c (do_include_next): Use cpp_in_primary_file.
+	(do_pragma_once): Likewise.
+	(do_pragma_system_header): Likewise.
+
 2006-12-29  Ian Lance Taylor  <iant@google.com>
 
 	* lex.c (_cpp_clean_line): Add uses of __builtin_expect.  Don't
diff --git a/libcpp/directives.c b/libcpp/directives.c
index 7fb142e48c79..2ef914a435e9 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -1,6 +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 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005,
+   2007 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
@@ -772,7 +773,7 @@ do_include_next (cpp_reader *pfile)
 
   /* If this is the primary source file, warn and use the normal
      search logic.  */
-  if (! pfile->buffer->prev)
+  if (cpp_in_primary_file (pfile))
     {
       cpp_error (pfile, CPP_DL_WARNING,
 		 "#include_next in primary source file");
@@ -1346,7 +1347,7 @@ do_pragma (cpp_reader *pfile)
 static void
 do_pragma_once (cpp_reader *pfile)
 {
-  if (pfile->buffer->prev == NULL)
+  if (cpp_in_primary_file (pfile))
     cpp_error (pfile, CPP_DL_WARNING, "#pragma once in main file");
 
   check_eol (pfile);
@@ -1396,9 +1397,7 @@ do_pragma_poison (cpp_reader *pfile)
 static void
 do_pragma_system_header (cpp_reader *pfile)
 {
-  cpp_buffer *buffer = pfile->buffer;
-
-  if (buffer->prev == 0)
+  if (cpp_in_primary_file (pfile))
     cpp_error (pfile, CPP_DL_WARNING,
 	       "#pragma system_header ignored outside include file");
   else
diff --git a/libcpp/internal.h b/libcpp/internal.h
index 857bfe1d8c58..20f423580517 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -1,5 +1,5 @@
 /* Part of CPP library.
-   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007
    Free Software Foundation, Inc.
 
 This program is free software; you can redistribute it and/or modify it
@@ -488,6 +488,13 @@ cpp_in_system_header (cpp_reader *pfile)
 #define CPP_PEDANTIC(PF) CPP_OPTION (PF, pedantic)
 #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, warn_traditional)
 
+static inline int cpp_in_primary_file (cpp_reader *);
+static inline int
+cpp_in_primary_file (cpp_reader *pfile)
+{
+  return pfile->line_table->depth == 1;
+}
+
 /* In errors.c  */
 extern int _cpp_begin_message (cpp_reader *, int,
 			       source_location, unsigned int);
-- 
GitLab