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());
//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),
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);
}
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
@implementation MyList (BasicTest) // expected-error {{cannot find interface declaration for 'MyList'}}
- (void)compilerTestAgainst {
MyList * el; // expected-error {{use of undeclared identifier 'MyList'}}
- for (el in @"foo") // expected-error {{use of undeclared identifier 'el'}} \
- // expected-error {{cannot find interface declaration for 'NSConstantString'}}
+ for (el in @"foo") // expected-error {{use of undeclared identifier 'el'}}
{ LOOP(); }
}
@end
+++ /dev/null
-// RUN: clang %s -verify -fsyntax-only
-
-@class NSString;
-
-// GCC considers this an error, so clang will...
-NSString *s = @"123"; // expected-error: {{cannot find interface declaration for 'NSConstantString'}}
-
@synthesize query = _query;
- (void) _clearQuery
{
- [self.query removeObserver: self forKeyPath: @"matches"]; // expected-error{{cannot find interface declaration for 'NSConstantString'}}
+ [self.query removeObserver: self forKeyPath: @"matches"];
}
@end