Just found out that all of the following work:
printf( "%ls\n", "123" L"456" );
printf( "%ls\n", L"123" "456" );
printf( "%ls\n", L"123" L"456" );
The output is
123456
123456
123456
Why can I freely mix and match wide and narrow string literals to get a wide string literal as a result? Is that a documented behavior?
Yes, this behavior is supported by the standard, from section
6.4.5
String literals paragrph 4 of the C99 draft standard says (emphasis mine):