summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-16 13:12:01 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-05-16 13:12:01 +0000
commitbc9c1170932652e45b1a45c4f85733659434dfe6 (patch)
treedcbf7ea722daee0f7d3be438882069680a076f7d
parentc0fc306e67a6703e1ec420e842a2184a4b12dcb6 (diff)
downloadgcc-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/ChangeLog10
-rw-r--r--gcc/cp/pt.c3
-rw-r--r--gcc/cp/semantics.c12
-rw-r--r--gcc/cp/tree.c7
-rw-r--r--gcc/cp/typeck.c2
-rw-r--r--gcc/cp/typeck2.c5
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,