OSDN Git Service

* call.c (equal_functions): Also call decls_match for extern "C" fns.
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Oct 2000 21:38:33 +0000 (21:38 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 23 Oct 2000 21:38:33 +0000 (21:38 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@37024 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.old-deja/g++.other/externC3.C [new file with mode: 0644]

index 635105c..f7c2344 100644 (file)
@@ -1,3 +1,12 @@
+2000-10-23  Jason Merrill  <jason@redhat.com>
+
+       * call.c (equal_functions): Also call decls_match for extern "C" fns.
+
+2000-10-22  Jason Merrill  <jason@redhat.com>
+
+       * call.c (build_conditional_expr): Use ocp_convert to force
+       rvalue conversion.
+
 2000-10-22  Mark Mitchell  <mark@codesourcery.com>
 
        * call.c (standard_conversion): Use RVALUE_CONVs for all
index c31333e..ba77b64 100644 (file)
@@ -4931,14 +4931,16 @@ add_warning (winner, loser)
 }
 
 /* Returns true iff functions are equivalent. Equivalent functions are
-   not identical only if one is a function-local extern function.  */
+   not '==' only if one is a function-local extern function or if
+   both are extern "C".  */
 
 static inline int
 equal_functions (fn1, fn2)
      tree fn1;
      tree fn2;
 {
-  if (DECL_LOCAL_FUNCTION_P (fn1) || DECL_LOCAL_FUNCTION_P (fn2))
+  if (DECL_LOCAL_FUNCTION_P (fn1) || DECL_LOCAL_FUNCTION_P (fn2)
+      || DECL_EXTERN_C_FUNCTION_P (fn1))
     return decls_match (fn1, fn2);
   return fn1 == fn2;
 }
diff --git a/gcc/testsuite/g++.old-deja/g++.other/externC3.C b/gcc/testsuite/g++.old-deja/g++.other/externC3.C
new file mode 100644 (file)
index 0000000..4869635
--- /dev/null
@@ -0,0 +1,15 @@
+// Test that two extern "C" declarations of the same name in different
+// namespaces are treated as declaring the same function.
+
+namespace foo {
+  extern "C" int f ();
+}
+
+extern "C" int f () { return 0; }
+
+using namespace foo;
+
+int main ()
+{
+  f ();
+}