https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105109
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- There isn't really a good way (w/o further analysis) to improve what update_address_taken does. While it probably could use a BIT_INSERT_EXPR instead of reading the other component and using a COMPLEX_EXPR the latter is what is considered canonical. There's the opportunity to "simplify" _5 = IMAGPART_EXPR <exp$0_12(D)>; exp$0_26 = COMPLEX_EXPR <-3.1400001049041748046875e+0, _5>; to just exp$0_26 = COMPLEX_EXPR <-3.1400001049041748046875e+0, _5(D)>; but that would lose diagnostics. gimplify_modify_expr_complex_part does ocode = code == REALPART_EXPR ? IMAGPART_EXPR : REALPART_EXPR; other = build1 (ocode, TREE_TYPE (rhs), lhs); suppress_warning (other); so it suppresses diagnostics on the fake read. I'm going to do the same for the rewriting in update_address_taken.