re PR c++/26195 (pragma interface no longer handles explicit names)
authorZak Kipling <zak@transversal.com>
Thu, 7 Sep 2006 06:53:21 +0000 (06:53 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 7 Sep 2006 06:53:21 +0000 (02:53 -0400)
        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

13 files changed:
gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/cp/lex.c
gcc/cp/semantics.c
gcc/testsuite/g++.dg/ext/interface2.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface2a.h [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface2b.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/dir1/interface3.h [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/dir2/interface3.h [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/interface3a.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/interface3a2.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/interface3b.C [new file with mode: 0644]
gcc/testsuite/g++.dg/ext/interface3/interface3b2.cc [new file with mode: 0644]

index 9e17ccef773b35605f8ae63ba528cd6083f96cbf..c6da5e29a34a37a72eae8e6308aaeb3170668683 100644 (file)
@@ -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
index 95f0695c6f685dac75ab5c17c1206fbe92076414..46c1d33874c3e377388a0e0282a4d21425288b4f 100644 (file)
@@ -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.  */
index 5dbaf8b0464f47503b4df6904fe425570f03806a..d14a1baa926e3511ae9b8e899bad4f837d499476 100644 (file)
@@ -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;
     }
index 3ec0a1a1a95db48a712739cef0f2021b8d34c5d6..3c7281880d4ec10752d6b862a02e89b0562022fc 100644 (file)
@@ -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 (file)
index 0000000..3b306fd
--- /dev/null
@@ -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 (file)
index 0000000..efde3e2
--- /dev/null
@@ -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 (file)
index 0000000..9109949
--- /dev/null
@@ -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 (file)
index 0000000..874be75
--- /dev/null
@@ -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 (file)
index 0000000..df6f7cd
--- /dev/null
@@ -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 (file)
index 0000000..b324dbe
--- /dev/null
@@ -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 (file)
index 0000000..cbf1ba8
--- /dev/null
@@ -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 (file)
index 0000000..03f7532
--- /dev/null
@@ -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 (file)
index 0000000..f532adc
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/26195
+extern void g1();
+extern void g2();
+
+int main()
+{
+  g1();
+  g2();
+}