From: Steve Naroff Date: Wed, 1 Apr 2009 21:16:31 +0000 (+0000) Subject: CodeGenModule::GetAddrOfConstantCFString(): X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b59212a6e494d2c364b54462f545833902c29158;p=clang 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/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 74a13478c1..44317c3c6c 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1441,8 +1441,6 @@ def err_ret_local_block : Error< // CFString checking def err_cfstring_literal_not_string_constant : Error< "CFString literal is not a string constant">; -def warn_cfstring_literal_contains_non_ascii_character : Warning< - "CFString literal contains non-ASCII character">; def warn_cfstring_literal_contains_nul_character : Warning< "CFString literal contains NUL character">; diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 2e84c6049d..44a045ef8a 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/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: 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 &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/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 4bf8fc9dce..1802b6e942 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/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) diff --git a/test/SemaObjC/ucn-objc-string.m b/test/SemaObjC/ucn-objc-string.m new file mode 100644 index 0000000000..918fbc2620 --- /dev/null +++ b/test/SemaObjC/ucn-objc-string.m @@ -0,0 +1,13 @@ +// RUN: clang %s -verify -fsyntax-only +@class NSString; +extern void NSLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); + +int main() { + NSLog(@"Hi…"); + NSLog(@"Exposé"); + // FIXME: the following 2 are still not working (will investigate). + //NSLog(@"hello \u2192 \u2603 \u2190 world"); + //NSLog(@"\U00010400\U0001D12B"); + return 0; +} +