diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-06-08 02:16:11 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-06-08 02:16:11 +0000 |
| commit | 31afb956ae609d051060a70004978ff8c5278add (patch) | |
| tree | 2a9db3c294eac3a72ed844bd15d4d1d5d3792a48 /clang | |
| parent | 5677536bff8c1bc018a3ebba2331b46a8b20ddb8 (diff) | |
| download | bcm5719-llvm-31afb956ae609d051060a70004978ff8c5278add.tar.gz bcm5719-llvm-31afb956ae609d051060a70004978ff8c5278add.zip | |
[libclang/AST]
AST: For auto-synthesized ivars give them the location of the related
property (previously they had no source location). This allows them
to be indexed by libclang.
libclang: Make sure synthesized ivars are indexed before the methods that
may reference them.
Fixes rdar://11607001.
llvm-svn: 158189
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaObjCProperty.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Index/index-decls.m | 15 | ||||
| -rw-r--r-- | clang/tools/libclang/IndexDecl.cpp | 15 |
3 files changed, 29 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 52859d4f6d2..91fe0ba92be 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -1502,7 +1502,7 @@ void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl, true, /* property = */ Prop->getIdentifier(), /* ivar = */ getDefaultSynthIvarName(Prop, Context), - SourceLocation())); + Prop->getLocation())); if (PIDecl) { Diag(Prop->getLocation(), diag::warn_missing_explicit_synthesis); Diag(IMPDecl->getLocation(), diag::note_while_in_implementation); diff --git a/clang/test/Index/index-decls.m b/clang/test/Index/index-decls.m index 9e4e620497f..bf5e2c89ca8 100644 --- a/clang/test/Index/index-decls.m +++ b/clang/test/Index/index-decls.m @@ -11,11 +11,21 @@ @synthesize prop = _prop; @end -rdar://11015325 +// rdar://11015325 @interface I1 __attribute__((something)) @interface I2 @end @end +@interface I3 +@property (assign,readwrite) id auto_prop; +@end + +@implementation I3 +-(void)meth { + _auto_prop = 0; +} +@end + // RUN: c-index-test -index-file %s > %t // RUN: FileCheck %s -input-file=%t // CHECK: [indexDeclaration]: kind: objc-class | name: I | {{.*}} | loc: 1:12 @@ -28,3 +38,6 @@ __attribute__((something)) @interface I2 @end // CHECK: [indexDeclaration]: kind: objc-ivar | name: _prop | {{.*}} | loc: 11:20 // CHECK: [indexDeclaration]: kind: objc-instance-method | name: prop | {{.*}} | loc: 11:13 | {{.*}} | lexical-container: [I:10:17] // CHECK: [indexDeclaration]: kind: objc-instance-method | name: setProp: | {{.*}} | loc: 11:13 | {{.*}} | lexical-container: [I:10:17] + +// CHECK: [indexDeclaration]: kind: objc-ivar | name: _auto_prop | {{.*}} | loc: 20:33 +// CHECK: [indexEntityReference]: kind: objc-ivar | name: _auto_prop | {{.*}} | loc: 25:3 diff --git a/clang/tools/libclang/IndexDecl.cpp b/clang/tools/libclang/IndexDecl.cpp index c257c342aa7..7560398395a 100644 --- a/clang/tools/libclang/IndexDecl.cpp +++ b/clang/tools/libclang/IndexDecl.cpp @@ -154,7 +154,20 @@ public: IndexCtx.handleObjCImplementation(D); IndexCtx.indexTUDeclsInObjCContainer(); - IndexCtx.indexDeclContext(D); + + // Index the ivars first to make sure the synthesized ivars are indexed + // before indexing the methods that can reference them. + for (ObjCImplementationDecl::ivar_iterator + IvarI = D->ivar_begin(), + IvarE = D->ivar_end(); IvarI != IvarE; ++IvarI) { + IndexCtx.indexDecl(*IvarI); + } + for (DeclContext::decl_iterator + I = D->decls_begin(), E = D->decls_end(); I != E; ++I) { + if (!isa<ObjCIvarDecl>(*I)) + IndexCtx.indexDecl(*I); + } + return true; } |

