]> granicus.if.org Git - clang/commitdiff
Fix a miscompile of wchar pascal strings.
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 28 May 2010 19:40:48 +0000 (19:40 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 28 May 2010 19:40:48 +0000 (19:40 +0000)
(radar 8020384)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@104996 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/LiteralSupport.cpp
test/CodeGen/pascal-wchar-string.c [new file with mode: 0644]

index b73f236641c01d45ccff77ca8edc9e4fd2fcfa43..ff4d28f1288abab0f59f841e93b1205f69ff5d64 100644 (file)
@@ -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/test/CodeGen/pascal-wchar-string.c b/test/CodeGen/pascal-wchar-string.c
new file mode 100644 (file)
index 0000000..89e4de4
--- /dev/null
@@ -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"