diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2010-04-02 20:10:03 +0000 | 
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2010-04-02 20:10:03 +0000 | 
| commit | fe3ead7c48eb6884e002dea7a5bb6d7e43c8d2bd (patch) | |
| tree | 6323e115e4d8347fbf3967bb333eaf48df22c311 /clang/lib | |
| parent | a9f8675e02cf172dafff94da0e583abaf6f3e8b0 (diff) | |
| download | bcm5719-llvm-fe3ead7c48eb6884e002dea7a5bb6d7e43c8d2bd.tar.gz bcm5719-llvm-fe3ead7c48eb6884e002dea7a5bb6d7e43c8d2bd.zip | |
Sema/Obj-C: Narrow type of ObjCIvarDecl::Create, and check additional invariants on the provided DeclContext.
 - Doug, please see the FIXME in DeclObjC.cpp -- I am not sure what the right fix is.
llvm-svn: 100213
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/ASTImporter.cpp | 3 | ||||
| -rw-r--r-- | clang/lib/AST/DeclObjC.cpp | 18 | 
2 files changed, 19 insertions, 2 deletions
| diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 75cf1380a11..f7d08e8b77b 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -2013,7 +2013,8 @@ Decl *ASTNodeImporter::VisitObjCIvarDecl(ObjCIvarDecl *D) {    if (!BitWidth && D->getBitWidth())      return 0; -  ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), DC,  +  ObjCIvarDecl *ToIvar = ObjCIvarDecl::Create(Importer.getToContext(), +                                              cast<ObjCContainerDecl>(DC),                                                Loc, Name.getAsIdentifierInfo(),                                                T, TInfo, D->getAccessControl(),                                                BitWidth); diff --git a/clang/lib/AST/DeclObjC.cpp b/clang/lib/AST/DeclObjC.cpp index ab6b9e1f45a..63f3e047724 100644 --- a/clang/lib/AST/DeclObjC.cpp +++ b/clang/lib/AST/DeclObjC.cpp @@ -561,10 +561,26 @@ bool ObjCInterfaceDecl::ClassImplementsProtocol(ObjCProtocolDecl *lProto,  // ObjCIvarDecl  //===----------------------------------------------------------------------===// -ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, DeclContext *DC, +ObjCIvarDecl *ObjCIvarDecl::Create(ASTContext &C, ObjCContainerDecl *DC,                                     SourceLocation L, IdentifierInfo *Id,                                     QualType T, TypeSourceInfo *TInfo,                                     AccessControl ac, Expr *BW) { +  if (DC) { +    // Ivar's can only appear in interfaces, implementations (via synthesized +    // properties), and class extensions (via direct declaration, or synthesized +    // properties). +    // +    // FIXME: This should really be asserting this: +    //   (isa<ObjCCategoryDecl>(DC) && +    //    cast<ObjCCategoryDecl>(DC)->IsClassExtension())) +    // but unfortunately we sometimes place ivars into non-class extension +    // categories on error. This breaks an AST invariant, and should not be +    // fixed. +    assert((isa<ObjCInterfaceDecl>(DC) || isa<ObjCImplementationDecl>(DC) || +            isa<ObjCCategoryDecl>(DC)) && +           "Invalid ivar decl context!"); +  } +    return new (C) ObjCIvarDecl(DC, L, Id, T, TInfo, ac, BW);  } | 

