From 93bef10131528bc37782629360f1e037aa9a830a Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 28 May 2010 19:40:48 +0000 Subject: [PATCH] Fix a miscompile of wchar pascal strings. (radar 8020384) llvm-svn: 104996 --- clang/lib/Lex/LiteralSupport.cpp | 2 ++ clang/test/CodeGen/pascal-wchar-string.c | 31 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 clang/test/CodeGen/pascal-wchar-string.c diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index b73f236641c0..ff4d28f1288a 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -905,6 +905,8 @@ StringLiteralParser(const Token *StringToks, unsigned NumStringToks, if (Pascal) { ResultBuf[0] = ResultPtr-&ResultBuf[0]-1; + if (AnyWide) + ResultBuf[0] /= wchar_tByteWidth; // Verify that pascal strings aren't too large. if (GetStringLength() > 256 && Complain) { diff --git a/clang/test/CodeGen/pascal-wchar-string.c b/clang/test/CodeGen/pascal-wchar-string.c new file mode 100644 index 000000000000..89e4de489f09 --- /dev/null +++ b/clang/test/CodeGen/pascal-wchar-string.c @@ -0,0 +1,31 @@ +// RUN: %clang_cc1 -emit-llvm -o - %s -fpascal-strings -fshort-wchar | FileCheck %s +// rdar: // 8020384 + +extern void abort (void); + +typedef unsigned short UInt16; + +typedef UInt16 UniChar; + +int main(int argc, char* argv[]) +{ + + char st[] = "\pfoo"; // pascal string + UniChar wt[] = L"\pbar"; // pascal Unicode string + UniChar wt1[] = L"\p"; + UniChar wt2[] = L"\pgorf"; + + if (st[0] != 3) + abort (); + if (wt[0] != 3) + abort (); + if (wt1[0] != 0) + abort (); + if (wt2[0] != 4) + abort (); + + return 0; +} + +// CHECK: c"\03\00b\00a\00r\00\00\00" +// CHECK: c"\04\00g\00o\00r\00f\00\00\00"