diff options
author | Nico Weber <nicolasweber@gmx.de> | 2011-11-14 05:17:37 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2011-11-14 05:17:37 +0000 |
commit | d60b72f6964fe65f36b1bf15f47adc84d0091ec6 (patch) | |
tree | 3a4e7cc8dda117d5f44b3a2bcc4cae7eb5fa2013 | |
parent | 846e61a3636fe8f22f86fcab92bc19f8234ed421 (diff) | |
download | bcm5719-llvm-d60b72f6964fe65f36b1bf15f47adc84d0091ec6.tar.gz bcm5719-llvm-d60b72f6964fe65f36b1bf15f47adc84d0091ec6.zip |
Fix a regression in wide character codegen. See PR11369.
llvm-svn: 144521
-rw-r--r-- | clang/lib/Lex/LiteralSupport.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGen/string-literal-unicode-conversion.c | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 16f02f41306..296a89461f8 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/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<UTF32*>(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<UTF16*>(ResultPtr); - *ResultWidePtr = ResultChar & 0xFF; + *ResultWidePtr = ResultChar & 0xFFFF; ResultPtr += 2; } else { assert(CharByteWidth == 1 && "Unexpected char width"); diff --git a/clang/test/CodeGen/string-literal-unicode-conversion.c b/clang/test/CodeGen/string-literal-unicode-conversion.c index 7431d9a13d6..3e5b7fb0411 100644 --- a/clang/test/CodeGen/string-literal-unicode-conversion.c +++ b/clang/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 |