aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2021-08-27 10:00:49 -0400
committerJason Merrill <jason@redhat.com>2021-08-27 17:37:58 -0400
commit771fd4aef999903cb928bb89f730c61a8af6e4f8 (patch)
tree30c93d1fa1770e05591f70f3c3d36ab037432953
parentee914ec4f811243ad72aceea4748687c74f38bc6 (diff)
downloadgcc-771fd4aef999903cb928bb89f730c61a8af6e4f8.zip
gcc-771fd4aef999903cb928bb89f730c61a8af6e4f8.tar.gz
gcc-771fd4aef999903cb928bb89f730c61a8af6e4f8.tar.bz2
c++: Set type on dependent ARROW_EXPR
Even if the operand of -> has dependent type, if it's a pointer we know that the result will be the target type of that pointer. This should avoid some unnecessary TYPEOF_EXPR when looking up a name after ->. gcc/cp/ChangeLog: * typeck2.c (build_x_arrow): Do set TREE_TYPE when operand is a dependent pointer.
-rw-r--r--gcc/cp/typeck2.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index dcfdff2..5e2c23c 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1913,11 +1913,17 @@ build_x_arrow (location_t loc, tree expr, tsubst_flags_t complain)
if (processing_template_decl)
{
- if (type && TYPE_PTR_P (type)
- && !dependent_scope_p (TREE_TYPE (type)))
+ tree ttype = NULL_TREE;
+ if (type && TYPE_PTR_P (type))
+ ttype = TREE_TYPE (type);
+ if (ttype && !dependent_scope_p (ttype))
/* Pointer to current instantiation, don't treat as dependent. */;
else if (type_dependent_expression_p (expr))
- return build_min_nt_loc (loc, ARROW_EXPR, expr);
+ {
+ expr = build_min_nt_loc (loc, ARROW_EXPR, expr);
+ TREE_TYPE (expr) = ttype;
+ return expr;
+ }
expr = build_non_dependent_expr (expr);
}