https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89217
--- Comment #4 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Some sort of modification happens twice for the RANGE_FOR_EXPR. Originally we have {*((struct S *) this)->r} which should be turned to TARGET_EXPR <D.2334, {.r=(struct R &) (struct R *) ((struct S *) this)->r}> but we now reprocess this again and get bogus TARGET_EXPR <D.2344, {.r=(struct R &) (struct R *) (struct R &) (struct R *) *((struct S *) this)->r}>