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 ->.
Tested x86_64-pc-linux-gnu, applying to trunk. gcc/cp/ChangeLog: * typeck2.c (build_x_arrow): Do set TREE_TYPE when operand is a dependent pointer. --- gcc/cp/typeck2.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index dcfdff2f905..5e2c23c063c 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); } base-commit: ee914ec4f811243ad72aceea4748687c74f38bc6 -- 2.27.0