From 1f0ed17c4e88d930d29f1b372d218ff691dea3b6 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 16 May 2017 13:12:01 +0000 Subject: [PATCH] pt.c (tsubst_copy_and_build): Remove unnecessary COMPONENT_REF peeking. * pt.c (tsubst_copy_and_build): Remove unnecessary COMPONENT_REF peeking. * semantics.c (finish_id_expression): Directly init local var. (finish_omp_reduction_clause): Use really_overloaded_fn. * tree.c (get_fns): Document. Assert we got an overload. (get_first_fn) Document. * typeck.c (cp_build_addr_expr_1): Pass arg directly to really_overloaded_fn. * typeck2.c (cxx_inomplete_type_diagnostic): Use get_first_fn directly. From-SVN: r248106 --- gcc/cp/ChangeLog | 10 ++++++++++ gcc/cp/pt.c | 3 +-- gcc/cp/semantics.c | 12 +++++------- gcc/cp/tree.c | 7 ++++++- gcc/cp/typeck.c | 2 +- gcc/cp/typeck2.c | 5 ++--- 6 files changed, 25 insertions(+), 14 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 120d2b06062..ee25eface70 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,15 @@ 2017-05-16 Nathan Sidwell + * pt.c (tsubst_copy_and_build): Remove unnecessary COMPONENT_REF + peeking. + * semantics.c (finish_id_expression): Directly init local var. + (finish_omp_reduction_clause): Use really_overloaded_fn. + * tree.c (get_fns): Document. Assert we got an overload. + (get_first_fn) Document. + * typeck.c (cp_build_addr_expr_1): Pass arg directly to + really_overloaded_fn. + * typeck2.c (cxx_inomplete_type_diagnostic): Use get_first_fn directly. + * cp-tree.h (SCOPE_DEPTH): New. * name-lookup.h (is_nested_namespace): Declare. * name-lookup.c (is_nested_namespace): New. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index cc38e819f32..8f120aa1446 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -17187,10 +17187,9 @@ tsubst_copy_and_build (tree t, if (diag) { tree fn = unq; + if (INDIRECT_REF_P (fn)) fn = TREE_OPERAND (fn, 0); - if (TREE_CODE (fn) == COMPONENT_REF) - fn = TREE_OPERAND (fn, 1); if (is_overloaded_fn (fn)) fn = get_first_fn (fn); diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 7b2c101302f..6c46823cec0 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3749,9 +3749,8 @@ finish_id_expression (tree id_expression, } else if (is_overloaded_fn (decl)) { - tree first_fn; + tree first_fn = get_first_fn (decl); - first_fn = get_first_fn (decl); if (TREE_CODE (first_fn) == TEMPLATE_DECL) first_fn = DECL_TEMPLATE_RESULT (first_fn); @@ -5615,7 +5614,6 @@ finish_omp_reduction_clause (tree c, bool *need_default_ctor, bool *need_dtor) { if (id == error_mark_node) return true; - id = OVL_CURRENT (id); mark_used (id); tree body = DECL_SAVED_TREE (id); if (!body) @@ -6924,13 +6922,13 @@ finish_omp_clauses (tree clauses, enum c_omp_region_type ort) { if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE) { - if (TREE_CODE (t) == OVERLOAD && OVL_CHAIN (t)) + if (TREE_CODE (t) == TEMPLATE_ID_EXPR) error_at (OMP_CLAUSE_LOCATION (c), - "overloaded function name %qE in clause %qs", t, + "template %qE in clause %qs", t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]); - else if (TREE_CODE (t) == TEMPLATE_ID_EXPR) + else if (really_overloaded_fn (t)) error_at (OMP_CLAUSE_LOCATION (c), - "template %qE in clause %qs", t, + "overloaded function name %qE in clause %qs", t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]); else error_at (OMP_CLAUSE_LOCATION (c), diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 858d0d42537..2382f14b571 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2146,10 +2146,11 @@ really_overloaded_fn (tree x) return is_overloaded_fn (x) == 2; } +/* Get the overload set FROM refers to. */ + tree get_fns (tree from) { - gcc_assert (is_overloaded_fn (from)); /* A baselink is also considered an overloaded function. */ if (TREE_CODE (from) == OFFSET_REF || TREE_CODE (from) == COMPONENT_REF) @@ -2158,9 +2159,13 @@ get_fns (tree from) from = BASELINK_FUNCTIONS (from); if (TREE_CODE (from) == TEMPLATE_ID_EXPR) from = TREE_OPERAND (from, 0); + gcc_assert (TREE_CODE (from) == OVERLOAD + || TREE_CODE (from) == FUNCTION_DECL); return from; } +/* Return the first function of the overload set FROM refers to. */ + tree get_first_fn (tree from) { diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 26ef5ed5748..6bc88a9d780 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -5603,7 +5603,7 @@ cp_build_addr_expr_1 (tree arg, bool strict_lvalue, tsubst_flags_t complain) gcc_assert (!identifier_p (arg) || !IDENTIFIER_OPNAME_P (arg)); if (TREE_CODE (arg) == COMPONENT_REF && type_unknown_p (arg) - && !really_overloaded_fn (TREE_OPERAND (arg, 1))) + && !really_overloaded_fn (arg)) { /* They're trying to take the address of a unique non-static member function. This is ill-formed (except in MS-land), diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 216736dd000..b469fdb7b28 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -506,9 +506,8 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value, case OFFSET_TYPE: bad_member: { - tree member = TREE_OPERAND (value, 1); - if (is_overloaded_fn (member)) - member = get_first_fn (member); + tree member = get_first_fn (TREE_OPERAND (value, 1)); + if (DECL_FUNCTION_MEMBER_P (member) && ! flag_ms_extensions) emit_diagnostic (diag_kind, loc, 0, -- 2.30.2