diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 635105c732f..f7c2344c3ca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2000-10-23 Jason Merrill + + * call.c (equal_functions): Also call decls_match for extern "C" fns. + +2000-10-22 Jason Merrill + + * call.c (build_conditional_expr): Use ocp_convert to force + rvalue conversion. + 2000-10-22 Mark Mitchell * call.c (standard_conversion): Use RVALUE_CONVs for all diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c31333e9608..ba77b6490dd 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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 index 00000000000..48696356b67 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/externC3.C @@ -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 (); +}