https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80265
Jakub Jelinek <jakub at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2017-03-30 CC| |jakub at gcc dot gnu.org, | |jason at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- It fails even if s1/s2/s are all const char []. What cxx_eval_builtin_function_calls sees is after cxx_eval_constant_expression as args[0] is (const void *) &s1 and the middle-end obviously can't do anything with that. While the var may have DECL_INITIAL, if it isn't const, we don't know if we can use it, and the middle-end I think will not look at DECL_INITIAL anyway. Furthermore, what about cases like: constexpr int foo (char x, char y) { char a[10] = "abcde"; a[2] = x; a[4] = y; return __builtin_memcmp (a, "abAdB", 6); } etc.? Guess we'd need to be able to convert a CONSTRUCTOR to STRING_CST on the fly. Furthermore, the generic folding will give us as return value say for strstr or similar functions that return pointers into the arguments something like STRING_CST + value, while we in the end need instead ADDR_EXPR of the variable plus something. So perhaps we need to handle these builtins in the C++ FE? Jason, any thoughts on this?