From 4507a637202aad5caf3e3c90e0f152a67bbb26e7 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 7 Sep 2006 06:53:21 +0000 Subject: [PATCH] PR c++/26195 * decl.c (make_rtl_for_nonlocal_decl), (start_preparsed_function): Don't use lbasename on input_filename when calling get_fileinfo. * semantics.c (begin_class_definition): Likewise. * lex.c (cxx_make_type): Likewise. (handle_pragma_interface): Call get_fileinfo on input_filename, not on the parameter to the directive. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116740 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 11 +++++++++++ gcc/cp/decl.c | 4 ++-- gcc/cp/lex.c | 4 ++-- gcc/cp/semantics.c | 2 +- gcc/testsuite/g++.dg/ext/interface2.C | 7 +++++++ gcc/testsuite/g++.dg/ext/interface2a.h | 5 +++++ gcc/testsuite/g++.dg/ext/interface2b.cc | 9 +++++++++ gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h | 6 ++++++ gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h | 5 +++++ gcc/testsuite/g++.dg/ext/interface3/interface3a.C | 7 +++++++ gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc | 9 +++++++++ gcc/testsuite/g++.dg/ext/interface3/interface3b.C | 7 +++++++ gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc | 9 +++++++++ 13 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/interface2.C create mode 100644 gcc/testsuite/g++.dg/ext/interface2a.h create mode 100644 gcc/testsuite/g++.dg/ext/interface2b.cc create mode 100644 gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h create mode 100644 gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h create mode 100644 gcc/testsuite/g++.dg/ext/interface3/interface3a.C create mode 100644 gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc create mode 100644 gcc/testsuite/g++.dg/ext/interface3/interface3b.C create mode 100644 gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9e17ccef773..c6da5e29a34 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2006-09-06 Zak Kipling + + PR c++/26195 + * decl.c (make_rtl_for_nonlocal_decl), + (start_preparsed_function): Don't use lbasename on + input_filename when calling get_fileinfo. + * semantics.c (begin_class_definition): Likewise. + * lex.c (cxx_make_type): Likewise. + (handle_pragma_interface): Call get_fileinfo on input_filename, + not on the parameter to the directive. + 2006-09-06 Mark Mitchell PR c++/28903 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 95f0695c6f6..46c1d33874c 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4908,7 +4908,7 @@ make_rtl_for_nonlocal_decl (tree decl, tree init, const char* asmspec) { /* Fool with the linkage of static consts according to #pragma interface. */ - struct c_fileinfo *finfo = get_fileinfo (lbasename (filename)); + struct c_fileinfo *finfo = get_fileinfo (filename); if (!finfo->interface_unknown && !TREE_PUBLIC (decl)) { TREE_PUBLIC (decl) = 1; @@ -10357,7 +10357,7 @@ start_preparsed_function (tree decl1, tree attrs, int flags) struct cp_binding_level *bl; tree current_function_parms; struct c_fileinfo *finfo - = get_fileinfo (lbasename (LOCATION_FILE (DECL_SOURCE_LOCATION (decl1)))); + = get_fileinfo (LOCATION_FILE (DECL_SOURCE_LOCATION (decl1))); bool honor_interface; /* Sanity check. */ diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c index 5dbaf8b0464..d14a1baa926 100644 --- a/gcc/cp/lex.c +++ b/gcc/cp/lex.c @@ -503,7 +503,7 @@ handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED ) else filename = ggc_strdup (TREE_STRING_POINTER (fname)); - finfo = get_fileinfo (filename); + finfo = get_fileinfo (input_filename); if (impl_file_chain == 0) { @@ -809,7 +809,7 @@ cxx_make_type (enum tree_code code) /* Set up some flags that give proper default behavior. */ if (IS_AGGR_TYPE_CODE (code)) { - struct c_fileinfo *finfo = get_fileinfo (lbasename (input_filename)); + struct c_fileinfo *finfo = get_fileinfo (input_filename); SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, finfo->interface_unknown); CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only; } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 3ec0a1a1a95..3c7281880d4 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2174,7 +2174,7 @@ begin_class_definition (tree t, tree attributes) before. */ if (! TYPE_ANONYMOUS_P (t)) { - struct c_fileinfo *finfo = get_fileinfo (lbasename (input_filename)); + struct c_fileinfo *finfo = get_fileinfo (input_filename); CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only; SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, finfo->interface_unknown); diff --git a/gcc/testsuite/g++.dg/ext/interface2.C b/gcc/testsuite/g++.dg/ext/interface2.C new file mode 100644 index 00000000000..3b306fdd8bf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface2b.cc" } +// { dg-options "-fno-inline" } + +#pragma implementation "interface2-imaginary.h" +#include "interface2a.h" diff --git a/gcc/testsuite/g++.dg/ext/interface2a.h b/gcc/testsuite/g++.dg/ext/interface2a.h new file mode 100644 index 00000000000..efde3e24bc6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2a.h @@ -0,0 +1,5 @@ +// PR c++/26195 +#pragma interface "interface2-imaginary.h" + +inline void foo1() { } +inline void foo2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface2b.cc b/gcc/testsuite/g++.dg/ext/interface2b.cc new file mode 100644 index 00000000000..9109949b890 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface2b.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void foo1(); +extern void foo2(); + +int main() +{ + foo1(); + foo2(); +} diff --git a/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h b/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h new file mode 100644 index 00000000000..874be750934 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h @@ -0,0 +1,6 @@ +// PR c++/26195 +#pragma interface "dir1/interface3.h" +#include "../dir2/interface3.h" + +inline void f1() { } +inline void f2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h b/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h new file mode 100644 index 00000000000..df6f7cd2f5f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h @@ -0,0 +1,5 @@ +// PR c++/26195 +#pragma interface "dir2/interface3.h" + +inline void g1() { } +inline void g2() { } diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3a.C b/gcc/testsuite/g++.dg/ext/interface3/interface3a.C new file mode 100644 index 00000000000..b324dbef750 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3a.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface3a2.cc" } +// { dg-options "-I. -fno-inline" } + +#pragma implementation "dir1/interface3.cc" +#include "dir1/interface3.h" diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc b/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc new file mode 100644 index 00000000000..cbf1ba801bf --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void f1(); +extern void f2(); + +int main() +{ + f1(); + f2(); +} diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3b.C b/gcc/testsuite/g++.dg/ext/interface3/interface3b.C new file mode 100644 index 00000000000..03f7532094f --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3b.C @@ -0,0 +1,7 @@ +// PR c++/26195 +// { dg-do link } +// { dg-additional-sources "interface3b2.cc" } +// { dg-options "-fno-inline" } + +#pragma implementation "dir2/interface3.cc" +#include "dir1/interface3.h" diff --git a/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc b/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc new file mode 100644 index 00000000000..f532adc741c --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc @@ -0,0 +1,9 @@ +// PR c++/26195 +extern void g1(); +extern void g2(); + +int main() +{ + g1(); + g2(); +} -- 2.11.4.GIT