summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp15
-rw-r--r--clang/lib/Sema/SemaChecking.cpp7
2 files changed, 10 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 2e84c6049d5..44a045ef8a5 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1000,10 +1000,11 @@ static void appendFieldAndPadding(CodeGenModule &CGM,
}
}
-// 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 @@ GetAddrOfConstantCFString(const StringLiteral *Literal) {
&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 @@ GetAddrOfConstantCFString(const StringLiteral *Literal) {
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);
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 4bf8fc9dce1..1802b6e9425 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -173,13 +173,6 @@ bool Sema::CheckObjCString(Expr *Arg) {
unsigned Length = Literal->getByteLength();
for (unsigned i = 0; i < Length; ++i) {
- if (!isascii(Data[i])) {
- Diag(getLocationOfStringLiteralByte(Literal, i),
- diag::warn_cfstring_literal_contains_non_ascii_character)
- << Arg->getSourceRange();
- break;
- }
-
if (!Data[i]) {
Diag(getLocationOfStringLiteralByte(Literal, i),
diag::warn_cfstring_literal_contains_nul_character)
OpenPOWER on IntegriCloud