https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90694
Bug ID: 90694 Summary: incorrect representation of ADDR_EXPR involving a pointer to array Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- As mentioned in bug 90662 comment #2, the format of an ADDR_EXPR involving pointers to arrays printed in tree dumps is incorrect: it's missing the required parentheses. The test case below shows the problem. In it the strlen argument in #1 is equivalent to #2 but not to #3 or #4. Similarly, the strlen argument in #3 is equivalent to #4 but not to the other two. But the IL representation of #1 that's in the dump is identical to the source in #3: &*p[2], whose representation is actually p + 16. This is incorrect and makes tree dumps involving such expressions misleading. typedef char A8[8]; int f0 (A8 *p) { return __builtin_strlen (&(*p)[2]); // #1: this is equivalent... } int f1 (A8 *p) { return __builtin_strlen ((*p) + 2); // #2: ...to this } int g0 (A8 *p) { return __builtin_strlen (&*p[2]); // #3: and this is equivalent... } int g1 (A8 *p) { return __builtin_strlen ((*(p + 2))); // #4: ...to this } f0 (char[8] * p) { int D.1969; _1 = &*p[2]; ;; #1: but this corresponds to #3 above _2 = __builtin_strlen (_1); D.1969 = (int) _2; return D.1969; } f1 (char[8] * p) { int D.1971; _1 = p + 2; _2 = __builtin_strlen (_1); D.1971 = (int) _2; return D.1971; } g0 (char[8] * p) { int D.1973; _1 = p + 16; _2 = __builtin_strlen (_1); D.1973 = (int) _2; return D.1973; } g1 (char[8] * p) { int D.1975; _1 = p + 16; _2 = __builtin_strlen (_1); D.1975 = (int) _2; return D.1975; }