[libclang] Make sure that all top-level decls in a @implementation are

marked as such.

Previously we missed tag declarations; fixes rdar://10902015

llvm-svn: 151283
This commit is contained in:
Argyrios Kyrtzidis 2012-02-23 21:11:20 +00:00
parent fdad25a40a
commit 2e85c5f297
4 changed files with 38 additions and 3 deletions

View File

@ -5477,6 +5477,9 @@ public:
IdentifierInfo *CatName,
SourceLocation CatLoc);
DeclGroupPtrTy ActOnFinishObjCImplementation(Decl *ObjCImpDecl,
ArrayRef<Decl *> Decls);
DeclGroupPtrTy ActOnForwardClassDeclaration(SourceLocation Loc,
IdentifierInfo **IdentList,
SourceLocation *IdentLocs,

View File

@ -1532,9 +1532,7 @@ Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc) {
}
}
DeclsInGroup.push_back(ObjCImpDecl);
return Actions.BuildDeclaratorGroup(
DeclsInGroup.data(), DeclsInGroup.size(), false);
return Actions.ActOnFinishObjCImplementation(ObjCImpDecl, DeclsInGroup);
}
Parser::DeclGroupPtrTy

View File

@ -988,6 +988,25 @@ Decl *Sema::ActOnStartClassImplementation(
return ActOnObjCContainerStartDefinition(IMPDecl);
}
Sema::DeclGroupPtrTy
Sema::ActOnFinishObjCImplementation(Decl *ObjCImpDecl, ArrayRef<Decl *> Decls) {
SmallVector<Decl *, 64> DeclsInGroup;
DeclsInGroup.reserve(Decls.size() + 1);
for (unsigned i = 0, e = Decls.size(); i != e; ++i) {
Decl *Dcl = Decls[i];
if (!Dcl)
continue;
if (Dcl->getDeclContext()->isFileContext())
Dcl->setTopLevelDeclInObjCContainer();
DeclsInGroup.push_back(Dcl);
}
DeclsInGroup.push_back(ObjCImpDecl);
return BuildDeclaratorGroup(DeclsInGroup.data(), DeclsInGroup.size(), false);
}
void Sema::CheckImplementationIvars(ObjCImplementationDecl *ImpDecl,
ObjCIvarDecl **ivars, unsigned numIvars,
SourceLocation RBrace) {

View File

@ -26,6 +26,18 @@
@synthesize name = _name;
@end
@interface rdar10902015
@end
@implementation rdar10902015
struct S {};
-(void)mm:(struct S*)s {
rdar10902015 *i = 0;
}
@end
// RUN: c-index-test -cursor-at=%s:4:28 -cursor-at=%s:5:28 %s | FileCheck -check-prefix=CHECK-PROP %s
// CHECK-PROP: ObjCPropertyDecl=foo1:4:26
// CHECK-PROP: ObjCPropertyDecl=foo2:5:27
@ -35,3 +47,6 @@
// RUN: c-index-test -cursor-at=%s:20:10 %s | FileCheck -check-prefix=CHECK-METHOD %s
// CHECK-METHOD: ObjCInstanceMethodDecl=name:20:1
// RUN: c-index-test -cursor-at=%s:37:17 %s | FileCheck -check-prefix=CHECK-IN-IMPL %s
// CHECK-IN-IMPL: VarDecl=i:37:17