Commit f1e20710 by Tom Tromey Committed by Tom Tromey

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
parent b131ad7c
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> 2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570 PR c++/8570
......
...@@ -572,14 +572,14 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED ) ...@@ -572,14 +572,14 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
else else
{ {
filename = ggc_strdup (TREE_STRING_POINTER (fname)); filename = ggc_strdup (TREE_STRING_POINTER (fname));
#if 0 #ifdef USE_MAPPED_LOCATION
/* We currently cannot give this diagnostic, as we reach this point /* We currently cannot give this diagnostic, as we reach this point
only after cpplib has scanned the entire translation unit, so only after cpplib has scanned the entire translation unit, so
cpp_included always returns true. A plausible fix is to compare cpp_included always returns true. A plausible fix is to compare
the current source-location cookie with the first source-location the current source-location cookie with the first source-location
cookie (if any) of the filename, but this requires completing the cookie (if any) of the filename, but this requires completing the
--enable-mapped-location project first. See PR 17577. */ --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 " warning (0, "#pragma implementation for %qs appears after "
"file is included", filename); "file is included", filename);
#endif #endif
......
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> 2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570 PR c++/8570
// Test for PR c++/17577.
/* { dg-do compile } */
#include "pr17577.h"
#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */
// Test for PR c++/17577.
#pragma interface
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> 2007-11-01 Tom Tromey <tromey@redhat.com>
PR preprocessor/30805: PR preprocessor/30805:
......
...@@ -142,6 +142,7 @@ struct file_hash_entry ...@@ -142,6 +142,7 @@ struct file_hash_entry
{ {
struct file_hash_entry *next; struct file_hash_entry *next;
cpp_dir *start_dir; cpp_dir *start_dir;
source_location location;
union union
{ {
_cpp_file *file; _cpp_file *file;
...@@ -521,6 +522,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f ...@@ -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 = new_file_hash_entry (pfile);
entry->next = *hash_slot; entry->next = *hash_slot;
entry->start_dir = start_dir; entry->start_dir = start_dir;
entry->location = pfile->line_table->highest_location;
entry->u.file = file; entry->u.file = file;
*hash_slot = entry; *hash_slot = entry;
...@@ -533,6 +535,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f ...@@ -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 = new_file_hash_entry (pfile);
entry->next = *hash_slot; entry->next = *hash_slot;
entry->start_dir = pfile->bracket_include; entry->start_dir = pfile->bracket_include;
entry->location = pfile->line_table->highest_location;
entry->u.file = file; entry->u.file = file;
*hash_slot = entry; *hash_slot = entry;
} }
...@@ -543,6 +546,7 @@ _cpp_find_file (cpp_reader *pfile, const char *fname, cpp_dir *start_dir, bool f ...@@ -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 = new_file_hash_entry (pfile);
entry->next = *hash_slot; entry->next = *hash_slot;
entry->start_dir = pfile->quote_include; entry->start_dir = pfile->quote_include;
entry->location = pfile->line_table->highest_location;
entry->u.file = file; entry->u.file = file;
*hash_slot = entry; *hash_slot = entry;
} }
...@@ -993,6 +997,7 @@ make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp) ...@@ -993,6 +997,7 @@ make_cpp_dir (cpp_reader *pfile, const char *dir_name, int sysp)
entry = new_file_hash_entry (pfile); entry = new_file_hash_entry (pfile);
entry->next = *hash_slot; entry->next = *hash_slot;
entry->start_dir = NULL; entry->start_dir = NULL;
entry->location = pfile->line_table->highest_location;
entry->u.dir = dir; entry->u.dir = dir;
*hash_slot = entry; *hash_slot = entry;
...@@ -1036,6 +1041,25 @@ cpp_included (cpp_reader *pfile, const char *fname) ...@@ -1036,6 +1041,25 @@ cpp_included (cpp_reader *pfile, const char *fname)
return entry != NULL; 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. */ /* Calculate the hash value of a file hash entry P. */
static hashval_t static hashval_t
......
...@@ -853,6 +853,7 @@ extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *, ...@@ -853,6 +853,7 @@ extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
/* In cppfiles.c */ /* In cppfiles.c */
extern bool cpp_included (cpp_reader *, const char *); 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 void cpp_make_system_header (cpp_reader *, int, int);
extern bool cpp_push_include (cpp_reader *, const char *); extern bool cpp_push_include (cpp_reader *, const char *);
extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *); extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment