memchr and memcmp operate upon the character units of the object representation; that is, the size_t parameter expresses the number of character units. The constant folding implementation is updated in this patch to account for multibyte element types in the arrays passed to memchr/memcmp and, in the case of memcmp, to account for the possibility that the arrays may have differing element types (even when they are byte-sized).
Actual inspection of the object representation is not implemented. Comparisons are done only between elements with the same object size; that is, memchr will fail when inspecting at least one character unit of a multibyte element. The integer types are assumed to have two's complement representation with 0 for false, 1 for true, and no padding bits.
memcmp on multibyte elements will only be able to fold in cases where enough elements are equal for the answer to be 0.
Various tests are added to guard against incorrect folding for cases that miscompile on some system or other prior to this patch. At the same time, the unsigned 32-bit wchar_t testing in test/SemaCXX/constexpr-string.cpp is restored.