Rule A2-13-2 (required, implementation, automated)

String literals with different encoding prefixes shall not be concatenated.

Rationale

Concatenation of wide and narrow string literals leads to undefined behavior. “In translation phase 6 (2.2), adjacent string-literals are concatenated. If both stringliterals have the same encoding-prefix, the resulting concatenated string literal has that encoding-prefix. If one string-literal has no encoding-prefix, it is treated as a string-literal of the same encoding-prefix as the other operand. If a UTF-8 string literal token is adjacent to a wide string literal token, the program is ill-formed. Any other concatenations are conditionally-supported with implementation-defined behavior. [ Note: This concatenation is an interpretation, not a conversion. Because the interpretation happens in translation phase 6 (after each character from a literal has been translated into a value from the appropriate character set), a string-literal’s initial rawness has no effect on the interpretation or well-formedness of the concatenation. -end note ]” [C++14 Language Standard] [3]

Example

//% $Id: A2-13-2.cpp 305629 2018-01-29 13:29:25Z piotr.serwa $

char16_t nArray[] =
    u"Hello"
    u"World"; // Compliant, "u" stands for char16_t type

char32_t nArray2[] =
    U"Hello"
    U"World"; // Compliant, "U" stands for char32_t type

wchar_t wArray[] =
    L"Hello"
    L"World"; // Compliant, "L" stands for wchar_t type - violates A2-13-3
              // rule.

wchar_t mixed1[] =
    "Hello"
    L"World"; // Compliant

char32_t mixed2[] =
    "Hello"
    U"World"; // Compliant

char16_t mixed3[] =
    "Hello"
    u"World"; // Compliant

// wchar_t mixed1[] = u"Hello" L"World"; // Non-compliant - compilation error

// char32_t mixed2[] = u"Hello" U"World"; // Non-compliant - compilation error

See also

MISRA C++ 2008 [7]: required 2-13-5 Narrow and wide string literals shall not be concatenated.

HIC++ v4.0 [9]: 2.5.1 Do not concatenate strings with different encoding prefixes