From 294e855f96883c225bb8961eb456d8f770bdf41a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 27 Apr 2010 17:35:17 -0400 Subject: [PATCH] tree.c (get_fns): Split out from get_first_fn. * tree.c (get_fns): Split out from get_first_fn. * cp-tree.h: Declare it. * search.c (shared_member_p): Use it. * semantics.c (finish_qualified_id_expr): Simplify. (finish_id_expression): Simplify. From-SVN: r158810 --- gcc/cp/ChangeLog | 8 +++++++- gcc/cp/cp-tree.h | 1 + gcc/cp/search.c | 1 + gcc/cp/semantics.c | 11 ++--------- gcc/cp/tree.c | 10 ++++++++-- 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index f19d06f9dc6..08746bae335 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,10 @@ -2010-04-27 Jason Merrill +2010-04-24 Jason Merrill + + * tree.c (get_fns): Split out from get_first_fn. + * cp-tree.h: Declare it. + * search.c (shared_member_p): Use it. + * semantics.c (finish_qualified_id_expr): Simplify. + (finish_id_expression): Simplify. * semantics.c (finish_non_static_data_member): Call maybe_dummy_object whenever object is NULL_TREE. Don't do 'this' capture here. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index 62e92cc81c7..cbb1ac65315 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -5259,6 +5259,7 @@ extern tree hash_tree_cons (tree, tree, tree); extern tree hash_tree_chain (tree, tree); extern tree build_qualified_name (tree, tree, tree, bool); extern int is_overloaded_fn (tree); +extern tree get_fns (tree); extern tree get_first_fn (tree); extern tree ovl_cons (tree, tree); extern tree build_overload (tree, tree); diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 772ae3b1fbe..11011e7f334 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -973,6 +973,7 @@ shared_member_p (tree t) return 1; if (is_overloaded_fn (t)) { + t = get_fns (t); for (; t; t = OVL_NEXT (t)) { tree fn = OVL_CURRENT (t); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 73fed153801..d4ce01496ee 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -1662,15 +1662,11 @@ finish_qualified_id_expr (tree qualifying_class, } else if (BASELINK_P (expr) && !processing_template_decl) { - tree fns; tree ob; /* See if any of the functions are non-static members. */ - fns = BASELINK_FUNCTIONS (expr); - if (TREE_CODE (fns) == TEMPLATE_ID_EXPR) - fns = TREE_OPERAND (fns, 0); /* If so, the expression may be relative to 'this'. */ - if (!shared_member_p (fns) + if (!shared_member_p (expr) && (ob = maybe_dummy_object (qualifying_class, NULL), !is_dummy_object (ob))) expr = (build_class_member_access_expr @@ -3124,10 +3120,7 @@ finish_id_expression (tree id_expression, { tree first_fn; - first_fn = decl; - if (TREE_CODE (first_fn) == TEMPLATE_ID_EXPR) - first_fn = TREE_OPERAND (first_fn, 0); - first_fn = get_first_fn (first_fn); + first_fn = get_first_fn (decl); if (TREE_CODE (first_fn) == TEMPLATE_DECL) first_fn = DECL_TEMPLATE_RESULT (first_fn); diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index f8b2c403af4..4d25cac186c 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1352,7 +1352,7 @@ really_overloaded_fn (tree x) } tree -get_first_fn (tree from) +get_fns (tree from) { gcc_assert (is_overloaded_fn (from)); /* A baselink is also considered an overloaded function. */ @@ -1363,7 +1363,13 @@ get_first_fn (tree from) from = BASELINK_FUNCTIONS (from); if (TREE_CODE (from) == TEMPLATE_ID_EXPR) from = TREE_OPERAND (from, 0); - return OVL_CURRENT (from); + return from; +} + +tree +get_first_fn (tree from) +{ + return OVL_CURRENT (get_fns (from)); } /* Return a new OVL node, concatenating it with the old one. */ -- 2.30.2