aboutsummaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authortromey <>2007-11-12 00:38:48 +0000
committertromey <>2007-11-12 00:38:48 +0000
commit3fe872b1541b79be83e76f47384bb8ab0485b869 (patch)
tree3f463456ccd4e5d3927d4137b115dbd7bb507c51 /libcpp
parent4630b61d3f6a4de98865c5c42f60d4148670d65e (diff)
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.
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog14
-rw-r--r--libcpp/files.c24
-rw-r--r--libcpp/include/cpplib.h1
3 files changed, 39 insertions, 0 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index c7cfa174709..4c33bd7d8d3 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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:
diff --git a/libcpp/files.c b/libcpp/files.c
index 73f88bb3cde..ae2f2945d9e 100644
--- a/libcpp/files.c
+++ b/libcpp/files.c
@@ -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
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index ff13cd6b532..01e982fbceb 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -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 *);