From: tromey Date: Mon, 12 Nov 2007 00:38:48 +0000 (+0000) Subject: gcc/cp X-Git-Url: http://git.sourceforge.jp/view?a=commitdiff_plain;h=67015c730c43858e8f3adac106439f2c59a5d518;p=pf3gnuchains%2Fgcc-fork.git 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) : 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index cfeea801148..1cc38952d7c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2007-11-11 Tom Tromey + + PR c++/17577: + * lex.c (handle_pragma_implementation): Use cpp_included_before. + 2007-11-12 Manuel Lopez-Ibanez PR c++/8570 diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 3bb1bf43620..136260bef49 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3c9a1a09891..b55f3c053ee 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2007-11-11 Tom Tromey + + PR c++/17577: + * g++.dg/ext/pr17577.h: New file. + * g++.dg/ext/pr17577.C: New file. + 2007-11-12 Manuel Lopez-Ibanez PR c++/8570 diff --git a/gcc/testsuite/g++.dg/ext/pr17577.C b/gcc/testsuite/g++.dg/ext/pr17577.C new file mode 100644 index 00000000000..29b1d17d705 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr17577.C @@ -0,0 +1,6 @@ +// Test for PR c++/17577. + +/* { dg-do compile } */ + +#include "pr17577.h" +#pragma implementation "pr17577.h" /* { dg-warning "appears after file" } */ diff --git a/gcc/testsuite/g++.dg/ext/pr17577.h b/gcc/testsuite/g++.dg/ext/pr17577.h new file mode 100644 index 00000000000..6ff0addb9dc --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/pr17577.h @@ -0,0 +1,2 @@ +// Test for PR c++/17577. +#pragma interface 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 + + PR c++/17557: + * include/cpplib.h (cpp_included_before): Declare. + * files.c (struct file_hash_entry) : New field. + (_cpp_find_file): Initialize new field. + (make_cpp_dir): Likewise. + (cpp_included_before): New function. + +2007-11-05 Tom Tromey + + * include/line-map.h (LINEMAP_POSITION_FOR_COLUMN): Wrap in + do-while. + 2007-11-01 Tom Tromey 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 *);