summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/AST/ASTContext.cpp3
-rw-r--r--clang/lib/AST/DeclObjC.cpp1
-rw-r--r--clang/lib/CodeGen/CGObjCMac.cpp7
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp5
4 files changed, 11 insertions, 5 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index cfff4b54402..c4597e2235e 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -644,6 +644,9 @@ void ASTContext::CollectObjCIvars(const ObjCInterfaceDecl *OI,
/// ivars and all those inherited.
///
const RecordDecl *ASTContext::addRecordToClass(const ObjCInterfaceDecl *D) {
+ // FIXME: The only client relying on this working in the presence of
+ // forward declarations is IRgen, which should not need it. Fix
+ // and simplify this code.
RecordDecl *&RD = ASTRecordForInterface[D];
if (RD) {
// If we have a record decl already and it is either a definition or if 'D'
diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp
index 9cc22912caf..5df5ff3a7ad 100644
--- a/clang/lib/AST/DeclObjC.cpp
+++ b/clang/lib/AST/DeclObjC.cpp
@@ -381,6 +381,7 @@ ObjCInterfaceDecl::FindCategoryDeclaration(IdentifierInfo *CategoryId) const {
const FieldDecl *
ObjCInterfaceDecl::lookupFieldDeclForIvar(ASTContext &Context,
const ObjCIvarDecl *IVar) const {
+ assert(!isForwardDecl() && "Invalid interface decl!");
const RecordDecl *RecordForDecl = Context.addRecordToClass(this);
assert(RecordForDecl && "lookupFieldDeclForIvar no storage for class");
DeclContext::lookup_const_result Lookup =
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index ed71b09942b..de29427c0e9 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/clang/lib/CodeGen/CGObjCMac.cpp
@@ -2564,11 +2564,7 @@ llvm::Constant *CGObjCCommonMac::GetClassName(IdentifierInfo *Ident) {
/// interface declaration.
const llvm::StructLayout *CGObjCCommonMac::GetInterfaceDeclStructLayout(
const ObjCInterfaceDecl *OID) const {
- // FIXME: When does this happen? It seems pretty bad to do this...
- if (OID->isForwardDecl())
- return CGM.getTargetData().getStructLayout(llvm::StructType::get(NULL,
- NULL));
-
+ assert(!OID->isForwardDecl() && "Invalid interface decl!");
QualType T =
CGM.getContext().getObjCInterfaceType(const_cast<ObjCInterfaceDecl*>(OID));
const llvm::StructType *InterfaceTy =
@@ -4231,6 +4227,7 @@ static int countInheritedIvars(const ObjCInterfaceDecl *OI,
void CGObjCNonFragileABIMac::GetClassSizeInfo(const ObjCInterfaceDecl *OID,
uint32_t &InstanceStart,
uint32_t &InstanceSize) {
+ assert(!OID->isForwardDecl() && "Invalid interface decl!");
const llvm::StructLayout *Layout = GetInterfaceDeclStructLayout(OID);
int countSuperClassIvars = countInheritedIvars(OID->getSuperClass(),
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp
index 5ab1efec037..2874f27cd3b 100644
--- a/clang/lib/Sema/SemaDeclObjC.cpp
+++ b/clang/lib/Sema/SemaDeclObjC.cpp
@@ -668,6 +668,11 @@ Sema::DeclPtrTy Sema::ActOnStartClassImplementation(
CurContext->addDecl(Context, IDecl);
// Remember that this needs to be removed when the scope is popped.
TUScope->AddDecl(DeclPtrTy::make(IDecl));
+ } else {
+ // Mark the interface as being completed, even if it was just as
+ // @class ....;
+ // declaration; the user cannot reopen it.
+ IDecl->setForwardDecl(false);
}
ObjCImplementationDecl* IMPDecl =
OpenPOWER on IntegriCloud