diff options
author | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-16 13:12:01 +0000 |
---|---|---|
committer | nathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-05-16 13:12:01 +0000 |
commit | bc9c1170932652e45b1a45c4f85733659434dfe6 (patch) | |
tree | dcbf7ea722daee0f7d3be438882069680a076f7d | |
parent | c0fc306e67a6703e1ec420e842a2184a4b12dcb6 (diff) | |
download | gcc-bc9c1170932652e45b1a45c4f85733659434dfe6.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248106 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/cp/pt.c | 3 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 12 | ||||
-rw-r--r-- | gcc/cp/tree.c | 7 | ||||
-rw-r--r-- | gcc/cp/typeck.c | 2 | ||||
-rw-r--r-- | 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 <nathan@acm.org> + * 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, |