Hi! For dependent expression followed by -> and identifier or ~ identifier, the parser creates COMPONENT_REF with ARROW_EXPR as its first argument. When printing that, we actually print expr->.identifier , which is not what the user typed. The following patch omits the undesirable dot in that case, we know that dump_expr on the ARROW_EXPR already printed ->
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2017-01-31 Jakub Jelinek <ja...@redhat.com> PR c++/79304 * error.c (dump_expr) <case COMPONENT_REF>: Don't print . after ARROW_EXPR. * g++.dg/diagnostic/pr79304.C: New test. --- gcc/cp/error.c.jj 2017-01-21 02:26:06.000000000 +0100 +++ gcc/cp/error.c 2017-01-31 17:03:17.737123973 +0100 @@ -2247,7 +2247,8 @@ dump_expr (cxx_pretty_printer *pp, tree else { dump_expr (pp, ob, flags | TFF_EXPR_IN_PARENS); - pp_cxx_dot (pp); + if (TREE_CODE (ob) != ARROW_EXPR) + pp_cxx_dot (pp); } dump_expr (pp, TREE_OPERAND (t, 1), flags & ~TFF_EXPR_IN_PARENS); } --- gcc/testsuite/g++.dg/diagnostic/pr79304.C.jj 2017-01-31 17:08:17.347318113 +0100 +++ gcc/testsuite/g++.dg/diagnostic/pr79304.C 2017-01-31 17:08:01.000000000 +0100 @@ -0,0 +1,20 @@ +// PR c++/79304 +// { dg-do compile } + +struct C { }; + +template<class T> +struct X +{ + C* c; + + void f() { + this->c.s(); // { dg-error "->c" } + } +}; + +int main() +{ + X<int> x; + x.f(); +} Jakub