https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86708
Bug ID: 86708 Summary: strlen of an empty aggregate element or member string not folded Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: msebor at gcc dot gnu.org Target Milestone: --- GCC 9 can fold explicitly initialized members of aggregates but it doesn't know to do the same for members or array elements that are initialized implicitly to the empty string, as in the following test case: $ cat c.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout c.c const char a[][4] = { "123" }; int f (int i) { return __builtin_strlen (a[1]); // not folded } const struct { char a[4], b[4]; } s = { "123" }; int g (int i) { return __builtin_strlen (s.b); // not folded } ;; Function f (f, funcdef_no=0, decl_uid=1899, cgraph_uid=1, symbol_order=1) f (int i) { long unsigned int _1; int _3; <bb 2> [local count: 1073741825]: _1 = __builtin_strlen (&a[1]); _3 = (int) _1; return _3; } ;; Function g (g, funcdef_no=1, decl_uid=1906, cgraph_uid=2, symbol_order=3) g (int i) { long unsigned int _1; int _3; <bb 2> [local count: 1073741825]: _1 = __builtin_strlen (&s.b); _3 = (int) _1; return _3; }