diff options
author | Jason Merrill <jason@redhat.com> | 2021-08-27 10:00:49 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-08-27 17:37:58 -0400 |
commit | 771fd4aef999903cb928bb89f730c61a8af6e4f8 (patch) | |
tree | 30c93d1fa1770e05591f70f3c3d36ab037432953 | |
parent | ee914ec4f811243ad72aceea4748687c74f38bc6 (diff) | |
download | gcc-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.c | 12 |
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); } |