CodeGenModule::GetAddrOfConstantCFString():
- Finish up support for converting UTF8->UTF16 to support ObjC @"string" constants.

Remove warning from CheckObjCString.

As the FIXME in the test case indicates, I still have a bug to work out (apparently with \u handling).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68245 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp
index 2e84c60..44a045e 100644
--- a/lib/CodeGen/CodeGenModule.cpp
+++ b/lib/CodeGen/CodeGenModule.cpp
@@ -1000,10 +1000,11 @@
   }
 }
 
-// We still need to work out the details of handling UTF-16. 
-// See: <rdr://2996215>
 llvm::Constant *CodeGenModule::
 GetAddrOfConstantCFString(const StringLiteral *Literal) {
+  std::string str;
+  unsigned StringLength;
+  
   bool isUTF16 = false;
   if (Literal->containsNonAsciiOrNull()) {
     // Convert from UTF-8 to UTF-16.
@@ -1016,10 +1017,14 @@
                                 &ToPtr, ToPtr+Literal->getByteLength(),
                                 strictConversion);
     assert(Result == conversionOK && "UTF-8 to UTF-16 conversion failed");
+    
+    StringLength = ToPtr-&ToBuf[0];
+    str.assign((char *)&ToBuf[0], StringLength*2); // Twice as many UTF8 chars.
     isUTF16 = true;
-    // FIXME: Do something with the converted value!
+  } else {
+    str.assign(Literal->getStrData(), Literal->getByteLength());
+    StringLength = str.length();
   }
-  std::string str(Literal->getStrData(), Literal->getByteLength());
   llvm::StringMapEntry<llvm::Constant *> &Entry = 
     CFConstantStringMap.GetOrCreateValue(&str[0], &str[str.length()]);
   
@@ -1093,7 +1098,7 @@
   NextField = 0;
   Ty = getTypes().ConvertType(getContext().LongTy);
   appendFieldAndPadding(*this, Fields, CurField, NextField,
-                        llvm::ConstantInt::get(Ty, str.length()), CFRD, STy);
+                        llvm::ConstantInt::get(Ty, StringLength), CFRD, STy);
   
   // The struct.
   C = llvm::ConstantStruct::get(STy, Fields);