diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/DeclObjC.cpp | 7 | ||||
-rw-r--r-- | lib/CodeGen/CGObjC.cpp | 14 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 7 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 6 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 2 |
5 files changed, 22 insertions, 14 deletions
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index 85b8ec14e0..1b098b5f89 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -220,13 +220,14 @@ ObjCPropertyDecl *ObjCPropertyDecl::Create(ASTContext &C, // Objective-C Decl Implementation //===----------------------------------------------------------------------===// -void ObjCMethodDecl::createImplicitParams(ASTContext &Context) { +void ObjCMethodDecl::createImplicitParams(ASTContext &Context, + const ObjCInterfaceDecl *OID) { QualType selfTy; if (isInstance()) { // There may be no interface context due to error in declaration // of the interface (which has been reported). Recover gracefully. - if (ObjCInterfaceDecl *OID = getClassInterface()) { - selfTy = Context.getObjCInterfaceType(OID); + if (OID) { + selfTy = Context.getObjCInterfaceType(const_cast<ObjCInterfaceDecl *>(OID)); selfTy = Context.getPointerType(selfTy); } else { selfTy = Context.getObjCIdType(); diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp index 845d5ff00c..e605065848 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -137,14 +137,15 @@ void CodeGenFunction::GenerateObjCMethod(const ObjCMethodDecl *OMD) { /// GenerateObjCGetter - Generate an Objective-C property getter /// function. The given Decl must be either an ObjCCategoryImplDecl /// or an ObjCImplementationDecl. -void CodeGenFunction::GenerateObjCGetter(const ObjCPropertyImplDecl *PID) { +void CodeGenFunction::GenerateObjCGetter(ObjCImplementationDecl *IMP, + const ObjCPropertyImplDecl *PID) { ObjCIvarDecl *Ivar = PID->getPropertyIvarDecl(); const ObjCPropertyDecl *PD = PID->getPropertyDecl(); ObjCMethodDecl *OMD = PD->getGetterMethodDecl(); assert(OMD && "Invalid call to generate getter (empty method)"); // FIXME: This is rather murky, we create this here since they will // not have been created by Sema for us. - OMD->createImplicitParams(getContext()); + OMD->createImplicitParams(getContext(), IMP->getClassInterface()); StartObjCMethod(OMD); // Determine if we should use an objc_getProperty call for @@ -173,7 +174,7 @@ void CodeGenFunction::GenerateObjCGetter(const ObjCPropertyImplDecl *PID) { QualType IdTy = getContext().getObjCIdType(); llvm::Value *SelfAsId = Builder.CreateBitCast(LoadObjCSelf(), Types.ConvertType(IdTy)); - llvm::Value *Offset = EmitIvarOffset(OMD->getClassInterface(), Ivar); + llvm::Value *Offset = EmitIvarOffset(IMP->getClassInterface(), Ivar); llvm::Value *True = llvm::ConstantInt::get(Types.ConvertTypeForMem(getContext().BoolTy), 1); CallArgList Args; @@ -204,14 +205,15 @@ void CodeGenFunction::GenerateObjCGetter(const ObjCPropertyImplDecl *PID) { /// GenerateObjCSetter - Generate an Objective-C property setter /// function. The given Decl must be either an ObjCCategoryImplDecl /// or an ObjCImplementationDecl. -void CodeGenFunction::GenerateObjCSetter(const ObjCPropertyImplDecl *PID) { +void CodeGenFunction::GenerateObjCSetter(ObjCImplementationDecl *IMP, + const ObjCPropertyImplDecl *PID) { ObjCIvarDecl *Ivar = PID->getPropertyIvarDecl(); const ObjCPropertyDecl *PD = PID->getPropertyDecl(); ObjCMethodDecl *OMD = PD->getSetterMethodDecl(); assert(OMD && "Invalid call to generate setter (empty method)"); // FIXME: This is rather murky, we create this here since they will // not have been created by Sema for us. - OMD->createImplicitParams(getContext()); + OMD->createImplicitParams(getContext(), IMP->getClassInterface()); StartObjCMethod(OMD); bool IsCopy = PD->getSetterKind() == ObjCPropertyDecl::Copy; @@ -244,7 +246,7 @@ void CodeGenFunction::GenerateObjCSetter(const ObjCPropertyImplDecl *PID) { QualType IdTy = getContext().getObjCIdType(); llvm::Value *SelfAsId = Builder.CreateBitCast(LoadObjCSelf(), Types.ConvertType(IdTy)); - llvm::Value *Offset = EmitIvarOffset(OMD->getClassInterface(), Ivar); + llvm::Value *Offset = EmitIvarOffset(IMP->getClassInterface(), Ivar); llvm::Value *Arg = LocalDeclMap[OMD->getParamDecl(0)]; llvm::Value *ArgAsId = Builder.CreateBitCast(Builder.CreateLoad(Arg, "arg"), diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 63af44f9cb..600582c96e 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -45,6 +45,7 @@ namespace clang { class ObjCInterfaceDecl; class ObjCIvarDecl; class ObjCMethodDecl; + class ObjCImplementationDecl; class ObjCPropertyImplDecl; class TargetInfo; class VarDecl; @@ -176,11 +177,13 @@ public: /// GenerateObjCGetter - Synthesize an Objective-C property getter /// function. - void GenerateObjCGetter(const ObjCPropertyImplDecl *PID); + void GenerateObjCGetter(ObjCImplementationDecl *IMP, + const ObjCPropertyImplDecl *PID); /// GenerateObjCSetter - Synthesize an Objective-C property setter /// function for the given property. - void GenerateObjCSetter(const ObjCPropertyImplDecl *PID); + void GenerateObjCSetter(ObjCImplementationDecl *IMP, + const ObjCPropertyImplDecl *PID); void GenerateCode(const FunctionDecl *FD, llvm::Function *Fn); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index c8fa994916..82e732163b 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -980,10 +980,12 @@ void CodeGenModule::EmitObjCPropertyImplementations(const // property. What we want to know is if the method is defined in // this implementation. if (!D->getInstanceMethod(PD->getGetterName())) - CodeGenFunction(*this).GenerateObjCGetter(PID); + CodeGenFunction(*this).GenerateObjCGetter( + const_cast<ObjCImplementationDecl *>(D), PID); if (!PD->isReadOnly() && !D->getInstanceMethod(PD->getSetterName())) - CodeGenFunction(*this).GenerateObjCSetter(PID); + CodeGenFunction(*this).GenerateObjCSetter( + const_cast<ObjCImplementationDecl *>(D), PID); } } } diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 308c125d9a..fa73bcf259 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -42,7 +42,7 @@ void Sema::ObjCActOnStartOfMethodDef(Scope *FnBodyScope, DeclTy *D) { // binding to their use. // Insert the invisible arguments, self and _cmd! - MDecl->createImplicitParams(Context); + MDecl->createImplicitParams(Context, MDecl->getClassInterface()); PushOnScopeChains(MDecl->getSelfDecl(), FnBodyScope); PushOnScopeChains(MDecl->getCmdDecl(), FnBodyScope); |