diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 92fed9792e4..07ebc11833c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ +1998-11-24 Graham + + * typeck.c (build_component_ref): Remove unused statement. + 1998-11-24 Jason Merrill + * class.c (add_method): Catch invalid overloads. + * class.c (add_method): Build up OVERLOADs properly for conversion ops. * search.c (lookup_conversions): Handle getting real OVERLOADs. (add_conversions): Likewise. Revert last change. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index de283eae2dd..8c098f03d2f 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -1208,6 +1208,26 @@ add_method (type, fields, method) if (TREE_CODE (method) != TEMPLATE_DECL) { + /* [over.load] Member function declarations with the + same name and the same parameter types cannot be + overloaded if any of them is a static member + function declaration. */ + if (DECL_STATIC_FUNCTION_P (fn) + != DECL_STATIC_FUNCTION_P (method)) + { + tree parms1 = TYPE_ARG_TYPES (TREE_TYPE (fn)); + tree parms2 = TYPE_ARG_TYPES (TREE_TYPE (method)); + + if (! DECL_STATIC_FUNCTION_P (fn)) + parms1 = TREE_CHAIN (parms1); + else + parms2 = TREE_CHAIN (parms2); + + if (compparms (parms1, parms2)) + cp_error ("`%#D' and `%#D' cannot be overloaded", + fn, method); + } + /* Since this is an ordinary function in a non-template class, it's mangled name can be used as a unique identifier. This technique diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index e944eee978f..18160be6637 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2059,10 +2059,7 @@ build_component_ref (datum, component, basetype_path, protect) && TREE_CODE (TREE_VALUE (fndecls)) == FUNCTION_DECL && DECL_STATIC_FUNCTION_P (TREE_VALUE (fndecls))) { - tree fndecl; - - basetype = TYPE_MAIN_VARIANT (TREE_PURPOSE (fndecls)); - fndecl = TREE_VALUE (fndecls); + tree fndecl = TREE_VALUE (fndecls); enforce_access (TREE_PURPOSE (fndecls), fndecl); mark_used (fndecl); return fndecl;