aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZak Kipling <zak@transversal.com>2006-09-07 06:53:21 +0000
committerJason Merrill <jason@gcc.gnu.org>2006-09-07 02:53:21 -0400
commitc533e34d7968ddd53f5dcdfdc580226a62da88b8 (patch)
tree8294996000e43badd6c4f6c4612d1dc1712f8576 /gcc
parentb5b84a7f46e8baead0f3d7b62d59659d83d67271 (diff)
downloadgcc-c533e34d7968ddd53f5dcdfdc580226a62da88b8.zip
gcc-c533e34d7968ddd53f5dcdfdc580226a62da88b8.tar.gz
gcc-c533e34d7968ddd53f5dcdfdc580226a62da88b8.tar.bz2
re PR c++/26195 (pragma interface no longer handles explicit names)
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. From-SVN: r116740
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog11
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/cp/lex.c4
-rw-r--r--gcc/cp/semantics.c2
-rw-r--r--gcc/testsuite/g++.dg/ext/interface2.C7
-rw-r--r--gcc/testsuite/g++.dg/ext/interface2a.h5
-rw-r--r--gcc/testsuite/g++.dg/ext/interface2b.cc9
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h6
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h5
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/interface3a.C7
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc9
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/interface3b.C7
-rw-r--r--gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc9
13 files changed, 80 insertions, 5 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9e17cce..c6da5e2 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,14 @@
+2006-09-06 Zak Kipling <zak@transversal.com>
+
+ 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 <mark@codesourcery.com>
PR c++/28903
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 95f0695..46c1d33 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 5dbaf8b..d14a1ba 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 3ec0a1a..3c72818 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 0000000..3b306fd
--- /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 0000000..efde3e2
--- /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 0000000..9109949
--- /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 0000000..874be75
--- /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 0000000..df6f7cd
--- /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 0000000..b324dbe
--- /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 0000000..cbf1ba8
--- /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 0000000..03f7532
--- /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 0000000..f532adc
--- /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();
+}