re PR c++/17577 (#pragma implementation no longer diagnoses use after file to which it applies)

gcc/cp
	PR c++/17577:
	* lex.c (handle_pragma_implementation): Use cpp_included_before.
gcc/testsuite
	PR c++/17577:
	* g++.dg/ext/pr17577.h: New file.
	* g++.dg/ext/pr17577.C: New file.
libcpp
	PR c++/17557:
	* include/cpplib.h (cpp_included_before): Declare.
	* files.c (struct file_hash_entry) <location>: New field.
	(_cpp_find_file): Initialize new field.
	(make_cpp_dir): Likewise.
	(cpp_included_before): New function.

From-SVN: r130093
This commit is contained in:
Tom Tromey 2007-11-12 00:38:48 +00:00 committed by Tom Tromey
parent b131ad7c3d
commit f1e207107a
8 changed files with 60 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2007-11-11 Tom Tromey <tromey@redhat.com>
PR c++/17577:
* lex.c (handle_pragma_implementation): Use cpp_included_before.
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570

View File

@ -572,14 +572,14 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
else
{
filename = ggc_strdup (TREE_STRING_POINTER (fname));
#if 0
#ifdef USE_MAPPED_LOCATION
/* We currently cannot give this diagnostic, as we reach this point
only after cpplib has scanned the entire translation unit, so
cpp_included always returns true. A plausible fix is to compare
the current source-location cookie with the first source-location
cookie (if any) of the filename, but this requires completing the
--enable-mapped-location project first. See PR 17577. */
if (cpp_included (parse_in, filename))
if (cpp_included_before (parse_in, filename, input_location))
warning (0, "#pragma implementation for %qs appears after "
"file is included", filename);
#endif

View File

@ -1,3 +1,9 @@
2007-11-11 Tom Tromey <tromey@redhat.com>
PR c++/17577:
* g++.dg/ext/pr17577.h: New file.
* g++.dg/ext/pr17577.C: New file.
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570

View File

@ -0,0 +1,6 @@
// Test for PR c++/17577.
/* { dg-do compile } */
#include "pr17577.h"
#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */

View File

@ -0,0 +1,2 @@
// Test for PR c++/17577.
#pragma interface

View File

@ -1,3 +1,17 @@
2007-11-11 Tom Tromey <tromey@redhat.com>
PR c++/17557:
* include/cpplib.h (cpp_included_before): Declare.
* files.c (struct file_hash_entry) <location>: New field.
(_cpp_find_file): Initialize new field.
(make_cpp_dir): Likewise.
(cpp_included_before): New function.
2007-11-05 Tom Tromey <tromey@redhat.com>
* include/line-map.h (LINEMAP_POSITION_FOR_COLUMN): Wrap in
do-while.
2007-11-01 Tom Tromey <tromey@redhat.com>
PR preprocessor/30805:

View File

@ -142,6 +142,7 @@ struct file_hash_entry
{
struct file_hash_entry *next;
cpp_dir *start_dir;
source_location location;
union
{
_cpp_file *file;
@ -521,6 +522,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = start_dir;
entry->location = pfile->line_table->highest_location;
entry->u.file = file;
*hash_slot = entry;
@ -533,6 +535,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = pfile->bracket_include;
entry->location = pfile->line_table->highest_location;
entry->u.file = file;
*hash_slot = entry;
}
@ -543,6 +546,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = pfile->quote_include;
entry->location = pfile->line_table->highest_location;
entry->u.file = file;
*hash_slot = entry;
}
@ -993,6 +997,7 @@ make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = NULL;
entry->location = pfile->line_table->highest_location;
entry->u.dir = dir;
*hash_slot = entry;
@ -1036,6 +1041,25 @@ cpp_included (cpp_reader *pfile, const char *fname)
return entry != NULL;
}
/* Returns TRUE if a file FNAME has ever been successfully opened
before LOCATION. This routine is not intended to correctly handle
filenames aliased by links or redundant . or .. traversals etc. */
bool
cpp_included_before (cpp_reader *pfile, const char *fname,
source_location location)
{
struct file_hash_entry *entry;
entry = (struct file_hash_entry *)
htab_find_with_hash (pfile->file_hash, fname, htab_hash_string (fname));
while (entry && (entry->start_dir == NULL || entry->u.file->err_no
|| entry->location > location))
entry = entry->next;
return entry != NULL;
}
/* Calculate the hash value of a file hash entry P. */
static hashval_t

View File

@ -853,6 +853,7 @@ extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
/* In cppfiles.c */
extern bool cpp_included (cpp_reader *, const char *);
extern bool cpp_included_before (cpp_reader *, const char *, source_location);
extern void cpp_make_system_header (cpp_reader *, int, int);
extern bool cpp_push_include (cpp_reader *, const char *);
extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);