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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130093
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570
else
{
filename = ggc_strdup (TREE_STRING_POINTER (fname));
else
{
filename = ggc_strdup (TREE_STRING_POINTER (fname));
+#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. */
/* 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
warning (0, "#pragma implementation for %qs appears after "
"file is included", filename);
#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>
PR c++/8570
2007-11-12 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR c++/8570
--- /dev/null
+// Test for PR c++/17577.
+
+/* { dg-do compile } */
+
+#include "pr17577.h"
+#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */
--- /dev/null
+// 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>
PR preprocessor/30805:
2007-11-01 Tom Tromey <tromey@redhat.com>
PR preprocessor/30805:
{
struct file_hash_entry *next;
cpp_dir *start_dir;
{
struct file_hash_entry *next;
cpp_dir *start_dir;
+ source_location location;
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = start_dir;
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;
entry->u.file = file;
*hash_slot = entry;
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = pfile->bracket_include;
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;
}
entry->u.file = file;
*hash_slot = entry;
}
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = pfile->quote_include;
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;
}
entry->u.file = file;
*hash_slot = entry;
}
entry = new_file_hash_entry (pfile);
entry->next = *hash_slot;
entry->start_dir = NULL;
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;
entry->u.dir = dir;
*hash_slot = entry;
+/* 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
/* Calculate the hash value of a file hash entry P. */
static hashval_t
/* In cppfiles.c */
extern bool cpp_included (cpp_reader *, const 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 *);
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 *);