diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGObjCGNU.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 20 |
3 files changed, 18 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index cae1f4bb248..fe11a5fb0ac 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -59,6 +59,10 @@ public: llvm::Constant *VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E) { return llvm::ConstantInt::get(ConvertType(E->getType()), E->getValue()); } + llvm::Constant *VisitObjCStringLiteral(const ObjCStringLiteral *E) { + return CGM.getObjCRuntime()->GenerateConstantString( + E->getString()->getStrData(), E->getString()->getByteLength()); + } llvm::Constant *VisitCompoundLiteralExpr(CompoundLiteralExpr *E) { return Visit(E->getInitializer()); diff --git a/clang/lib/CodeGen/CGObjCGNU.cpp b/clang/lib/CodeGen/CGObjCGNU.cpp index e545fc12eef..f2cfdcab82f 100644 --- a/clang/lib/CodeGen/CGObjCGNU.cpp +++ b/clang/lib/CodeGen/CGObjCGNU.cpp @@ -302,9 +302,10 @@ llvm::Constant *CGObjCGNU::MakeGlobal(const llvm::ArrayType *Ty, //constant strings. llvm::Constant *CGObjCGNU::GenerateConstantString(const char *String, const size_t length) { + std::string Str(String, String +length); std::vector<llvm::Constant*> Ivars; Ivars.push_back(NULLPtr); - Ivars.push_back(MakeConstantString(String)); + Ivars.push_back(MakeConstantString(Str)); Ivars.push_back(llvm::ConstantInt::get(IntTy, length)); llvm::Constant *ObjCStr = MakeGlobal( llvm::StructType::get(PtrToInt8Ty, PtrToInt8Ty, IntTy, NULL), diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index 920457e00c6..1aed69ec2c5 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -54,13 +54,17 @@ Sema::ExprResult Sema::ParseObjCStringLiteral(SourceLocation *AtLocs, IdentifierInfo *NSIdent = &Context.Idents.get("NSConstantString"); Decl *IFace = LookupDecl(NSIdent, Decl::IDNS_Ordinary, TUScope); ObjCInterfaceDecl *strIFace = dyn_cast_or_null<ObjCInterfaceDecl>(IFace); - if (!strIFace) - return Diag(S->getLocStart(), diag::err_undef_interface, - NSIdent->getName()); - Context.setObjCConstantStringInterface(strIFace); + if (strIFace) + Context.setObjCConstantStringInterface(strIFace); } QualType t = Context.getObjCConstantStringInterface(); - t = Context.getPointerType(t); + // If there is no NSConstantString interface defined then treat constant + // strings as untyped objects and let the runtime figure it out later. + if (t == QualType()) { + t = Context.getObjCIdType(); + } else { + t = Context.getPointerType(t); + } return new ObjCStringLiteral(S, t, AtLoc); } @@ -298,9 +302,9 @@ Sema::ExprResult Sema::ActOnInstanceMessage( else { ObjCInterfaceType *OCIReceiver =dyn_cast<ObjCInterfaceType>(receiverType); if (OCIReceiver == 0) { - Diag(lbrac, diag::error_bad_receiver_type, - RExpr->getType().getAsString()); - return true; + Diag(lbrac, diag::error_bad_receiver_type, + RExpr->getType().getAsString()); + return true; } ClassDecl = OCIReceiver->getDecl(); // FIXME: consider using InstanceMethodPool, since it will be faster |