This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Make missing headers fatal (PR 15638)


Having made cpplib use the compiler's diagnostic.c, making missing
headers an unconditional fatal error (as discussed in PR 15638) is
straightforward.  I've committed this patch; bootstrapped with no
regressions on i686-pc-linux-gnu.  (Fortran part committed as
obvious.)

Making these errors fatal runs into PCH tests expecting other
diagnostics for invalid PCH that GCC would emit after reporting the
header missing.  This patch adjusts the order in which the diagnostics
are emitted so the fatal error comes last.  In addition,
gcc.dg/cpp/include2.c involved missing header diagnostics for two
#include directives; I split it into two separate tests.

gcc:
2009-03-31  Joseph Myers  <joseph@codesourcery.com>

	PR preprocessor/15638
	* c-common.c (c_cpp_error): Handle CPP_DL_FATAL.

gcc/fortran:
2009-03-31  Joseph Myers  <joseph@codesourcery.com>

	PR preprocessor/15638
	* cpp.c (cb_cpp_error): Handle CPP_DL_FATAL.

gcc/testsuite:
2009-03-31  Joseph Myers  <joseph@codesourcery.com>

	PR preprocessor/15638
	* gcc.dg/cpp/missing-header-1.c: New test.
	* gcc.dg/cpp/include2.c: Only test #include <>.  Expect
	"compilation terminated" message.
	* gcc.dg/cpp/include2a.c: New test.  Copy of include2.c but only
	test #include "".
	* gcc.dg/pch/counter-2.c, gcc.dg/pch/valid-1.c,
	gcc.dg/pch/valid-2.c, gcc.dg/pch/warn-1.c: Expect "compilation
	terminated" message.

libcpp:
2009-03-31  Joseph Myers  <joseph@codesourcery.com>

	PR preprocessor/15638
	* files.c (_cpp_find_file): Call open_file_failed after diagnosing
	invalid PCH.
	(open_file_failed): Make error for missing file fatal.
	* include/cpplib.h (CPP_DL_FATAL): Define.

Index: gcc/c-common.c
===================================================================
--- gcc/c-common.c	(revision 145289)
+++ gcc/c-common.c	(working copy)
@@ -8009,6 +8009,9 @@ c_cpp_error (cpp_reader *pfile ATTRIBUTE
     case CPP_DL_NOTE:
       dlevel = DK_NOTE;
       break;
+    case CPP_DL_FATAL:
+      dlevel = DK_FATAL;
+      break;
     default:
       gcc_unreachable ();
     }
Index: gcc/fortran/cpp.c
===================================================================
--- gcc/fortran/cpp.c	(revision 145289)
+++ gcc/fortran/cpp.c	(working copy)
@@ -997,6 +997,9 @@ cb_cpp_error (cpp_reader *pfile ATTRIBUT
     case CPP_DL_NOTE:
       dlevel = DK_NOTE;
       break;
+    case CPP_DL_FATAL:
+      dlevel = DK_FATAL;
+      break;
     default:
       gcc_unreachable ();
     }
Index: gcc/testsuite/gcc.dg/cpp/include2.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/include2.c	(revision 145289)
+++ gcc/testsuite/gcc.dg/cpp/include2.c	(working copy)
@@ -8,9 +8,8 @@
 /* Source: Neil Booth, 4 Nov 2000.  */
 
 #include <silly\>>  /* { dg-error "extra tokens" "" } */
-#include "silly\""  /* { dg-error "extra tokens" "" } */
 
 /* These error is No such file or directory, just once.  However, this
    message is locale-dependent, so don't test for it.  */
 /* { dg-error "silly" "" { target *-*-* } 10 } */
-/* { dg-error "missing" "" { target *-*-* } 11 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
Index: gcc/testsuite/gcc.dg/cpp/include2a.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/include2a.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/include2a.c	(revision 0)
@@ -0,0 +1,16 @@
+/* Copyright (C) 2000 Free Software Foundation, Inc.  */
+
+/* { dg-do preprocess } */
+
+/* Tests that #include does not allow the terminating '>' or '"' to be
+   escaped, as per the standard.  */
+
+/* Source: Neil Booth, 4 Nov 2000.  */
+
+#include "silly\""  /* { dg-error "extra tokens" "" } */
+
+/* These error is No such file or directory, just once.  However, this
+   message is locale-dependent, so don't test for it.  */
+/* { dg-error "silly" "" { target *-*-* } 10 } */
+/* { dg-error "missing" "" { target *-*-* } 10 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
Index: gcc/testsuite/gcc.dg/cpp/missing-header-1.c
===================================================================
--- gcc/testsuite/gcc.dg/cpp/missing-header-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/cpp/missing-header-1.c	(revision 0)
@@ -0,0 +1,9 @@
+/* Test that missing headers are fatal errors.  PR 15638.  */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+#include "nonexistent.h" /* { dg-error "nonexistent.h" } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
+
+/* This declaration should not receive any diagnostic.  */
+foo bar;
Index: gcc/testsuite/gcc.dg/pch/counter-2.c
===================================================================
--- gcc/testsuite/gcc.dg/pch/counter-2.c	(revision 145289)
+++ gcc/testsuite/gcc.dg/pch/counter-2.c	(working copy)
@@ -10,6 +10,7 @@
 #include "counter-2.h" /* { dg-warning "not used because `__COUNTER__' is invalid" } */
 /* { dg-error "counter-2.h: No such file or directory" "no such file" { target *-*-* } 10 } */
 /* { dg-error "one or more PCH files were found, but they were invalid" "invalid files" { target *-*-* } 10 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
 
 int main(void) 
 {
Index: gcc/testsuite/gcc.dg/pch/valid-1.c
===================================================================
--- gcc/testsuite/gcc.dg/pch/valid-1.c	(revision 145289)
+++ gcc/testsuite/gcc.dg/pch/valid-1.c	(working copy)
@@ -3,5 +3,6 @@
 #include "valid-1.h"/* { dg-warning "created with -gnone, but used with -g" } */
 /* { dg-error "No such file" "no such file" { target *-*-* } 3 } */
 /* { dg-error "they were invalid" "invalid files" { target *-*-* } 3 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
 
 int x;
Index: gcc/testsuite/gcc.dg/pch/valid-2.c
===================================================================
--- gcc/testsuite/gcc.dg/pch/valid-2.c	(revision 145289)
+++ gcc/testsuite/gcc.dg/pch/valid-2.c	(working copy)
@@ -3,4 +3,5 @@
 #include "valid-2.h" /* { dg-warning "settings for -fexceptions do not match" } */
 /* { dg-error "No such file" "no such file" { target *-*-* } 3 } */
 /* { dg-error "they were invalid" "invalid files" { target *-*-* } 3 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
 int x;
Index: gcc/testsuite/gcc.dg/pch/warn-1.c
===================================================================
--- gcc/testsuite/gcc.dg/pch/warn-1.c	(revision 145289)
+++ gcc/testsuite/gcc.dg/pch/warn-1.c	(working copy)
@@ -5,6 +5,7 @@
 #include "warn-1.h"/* { dg-warning "not used because .DEFINED_VALUE. is defined" } */
 /* { dg-error "No such file" "no such file" { target *-*-* } 5 } */
 /* { dg-error "they were invalid" "invalid files" { target *-*-* } 5 } */
+/* { dg-message "terminated" "" { target *-*-* } 0 } */
 
 
 int main(void) 
Index: libcpp/files.c
===================================================================
--- libcpp/files.c	(revision 145289)
+++ libcpp/files.c	(working copy)
@@ -1,6 +1,6 @@
 /* Part of CPP library.  File handling.
    Copyright (C) 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1998,
-   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
    Free Software Foundation, Inc.
    Written by Per Bothner, 1994.
    Based on CCCP program by Paul Rubin, June 1986
@@ -488,7 +488,6 @@ _cpp_find_file (cpp_reader *pfile, const
 	      return file;
 	    }
 
-	  open_file_failed (pfile, file, angle_brackets);
 	  if (invalid_pch)
 	    {
 	      cpp_error (pfile, CPP_DL_ERROR,
@@ -497,6 +496,7 @@ _cpp_find_file (cpp_reader *pfile, const
 		cpp_error (pfile, CPP_DL_ERROR,
 			   "use -Winvalid-pch for more information");
 	    }
+	  open_file_failed (pfile, file, angle_brackets);
 	  break;
 	}
 
@@ -942,7 +942,7 @@ open_file_failed (cpp_reader *pfile, _cp
       if (CPP_OPTION (pfile, deps.style) && ! print_dep)
 	cpp_errno (pfile, CPP_DL_WARNING, file->path);
       else
-	cpp_errno (pfile, CPP_DL_ERROR, file->path);
+	cpp_errno (pfile, CPP_DL_FATAL, file->path);
     }
 }
 
Index: libcpp/include/cpplib.h
===================================================================
--- libcpp/include/cpplib.h	(revision 145289)
+++ libcpp/include/cpplib.h	(working copy)
@@ -813,6 +813,8 @@ cpp_num cpp_num_sign_extend (cpp_num, si
 #define CPP_DL_ICE		0x04
 /* An informative note following a warning.  */
 #define CPP_DL_NOTE		0x05
+/* A fatal error.  */
+#define CPP_DL_FATAL		0x06
 
 /* Output a diagnostic of some kind.  */
 extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]