From: Nico Weber Date: Mon, 14 Nov 2011 05:17:37 +0000 (+0000) Subject: Fix a regression in wide character codegen. See PR11369. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9b483df983759d51d61d54e8ae34bff423d15403;p=clang Fix a regression in wide character codegen. See PR11369. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144521 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/LiteralSupport.cpp b/lib/Lex/LiteralSupport.cpp index 16f02f4130..296a89461f 100644 --- a/lib/Lex/LiteralSupport.cpp +++ b/lib/Lex/LiteralSupport.cpp @@ -1095,13 +1095,13 @@ void StringLiteralParser::init(const Token *StringToks, unsigned NumStringToks){ // FIXME: Make the type of the result buffer correct instead of // using reinterpret_cast. UTF32 *ResultWidePtr = reinterpret_cast(ResultPtr); - *ResultWidePtr = ResultChar & 0xFF; + *ResultWidePtr = ResultChar; ResultPtr += 4; } else if (CharByteWidth == 2) { // FIXME: Make the type of the result buffer correct instead of // using reinterpret_cast. UTF16 *ResultWidePtr = reinterpret_cast(ResultPtr); - *ResultWidePtr = ResultChar & 0xFF; + *ResultWidePtr = ResultChar & 0xFFFF; ResultPtr += 2; } else { assert(CharByteWidth == 1 && "Unexpected char width"); diff --git a/test/CodeGen/string-literal-unicode-conversion.c b/test/CodeGen/string-literal-unicode-conversion.c index 7431d9a13d..3e5b7fb041 100644 --- a/test/CodeGen/string-literal-unicode-conversion.c +++ b/test/CodeGen/string-literal-unicode-conversion.c @@ -29,6 +29,11 @@ void f() { // CHECK-SHORTWCHAR: private unnamed_addr constant [6 x i16] [i16 1050, i16 1086, i16 1096, i16 1082, i16 1072, i16 0], align 2 // CHECK-CPP0X: private unnamed_addr constant [6 x i32] [i32 1050, i32 1086, i32 1096, i32 1082, i32 1072, i32 0], align 4 wchar_t const *b = L"Кошка"; + + // CHECK-C: private unnamed_addr constant [4 x i32] [i32 20320, i32 22909, i32 66304, i32 0], align 4 + // CHECK-SHORTWCHAR: private unnamed_addr constant [4 x i16] [i16 20320, i16 22909, i16 768, i16 0], align 2 + // CHECK-CPP0X: private unnamed_addr constant [4 x i32] [i32 20320, i32 22909, i32 66304, i32 0], align 4 + wchar_t const *b2 = L"\x4f60\x597d\x10300"; #if __cplusplus >= 201103L