Author: kremenek
Date: Fri Feb 4 19:10:26 2011
New Revision: 124920
URL: http://llvm.org/viewvc/llvm-project?rev=124920&view=rev
Log:
Don't crash when generating USRs for ObjC methods in protocols.
Modified:
cfe/trunk/test/Index/usrs.m
cfe/trunk/tools/libclang/CIndexUSRs.cpp
Modified: cfe/trunk/test/Index/usrs.m
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/usrs.m?rev=124920&r1=124919&r2=124920&view=diff
==============================================================================
--- cfe/trunk/test/Index/usrs.m (original)
+++ cfe/trunk/test/Index/usrs.m Fri Feb 4 19:10:26 2011
@@ -76,6 +76,10 @@
return 0;
}
+@protocol P1
+- (void)method;
+@end
+
// CHECK: usrs.m c:usrs.m@85@F@my_helper Extent=[3:19 - 3:60]
// CHECK: usrs.m c:usrs.m@95@F@my_helper@x Extent=[3:29 - 3:34]
// CHECK: usrs.m c:usrs.m@102@F@my_helper@y Extent=[3:36 - 3:41]
@@ -131,6 +135,8 @@
// CHECK: usrs.m c:usrs.m@980@F@test_multi_declaration@foo Extent=[74:3 -
74:14]
// CHECK: usrs.m c:usrs.m@980@F@test_multi_declaration@bar Extent=[74:16 -
74:23]
// CHECK: usrs.m c:usrs.m@980@F@test_multi_declaration@baz Extent=[74:25 -
74:32]
+// CHECK: usrs.m c:objc(pl)P1 Extent=[79:1 - 81:5]
+// CHECK: usrs.m c:objc(pl)P1(im)method Extent=[80:1 - 80:16]
// RUN: c-index-test -test-load-source all %s | FileCheck
-check-prefix=CHECK-source %s
// CHECK-source: usrs.m:3:19: FunctionDecl=my_helper:3:19 (Definition)
Extent=[3:19 - 3:60]
@@ -259,6 +265,6 @@
// CHECK-source: usrs.m:75:19: DeclRefExpr=baz:74:25 Extent=[75:19 - 75:22]
// CHECK-source: usrs.m:76:3: UnexposedStmt= Extent=[76:3 - 76:11]
// CHECK-source: usrs.m:76:10: UnexposedExpr= Extent=[76:10 - 76:11]
-
-
+// CHECK-source: usrs.m:79:1: ObjCProtocolDecl=P1:79:1 (Definition)
Extent=[79:1 - 81:5]
+// CHECK-source: usrs.m:80:1: ObjCInstanceMethodDecl=method:80:1 Extent=[80:1
- 80:16]
Modified: cfe/trunk/tools/libclang/CIndexUSRs.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndexUSRs.cpp?rev=124920&r1=124919&r2=124920&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndexUSRs.cpp (original)
+++ cfe/trunk/tools/libclang/CIndexUSRs.cpp Fri Feb 4 19:10:26 2011
@@ -283,15 +283,20 @@
}
void USRGenerator::VisitObjCMethodDecl(ObjCMethodDecl *D) {
- // The USR for a method declared in a class extension or category is based on
- // the ObjCInterfaceDecl, not the ObjCCategoryDecl.
- ObjCInterfaceDecl *ID = D->getClassInterface();
- if (!ID) {
- IgnoreResults = true;
- return;
+ DeclContext *container = D->getDeclContext();
+ if (ObjCProtocolDecl *pd = dyn_cast<ObjCProtocolDecl>(container)) {
+ Visit(pd);
+ }
+ else {
+ // The USR for a method declared in a class extension or category is based
on
+ // the ObjCInterfaceDecl, not the ObjCCategoryDecl.
+ ObjCInterfaceDecl *ID = D->getClassInterface();
+ if (!ID) {
+ IgnoreResults = true;
+ return;
+ }
+ Visit(ID);
}
- Visit(ID);
-
// Ideally we would use 'GenObjCMethod', but this is such a hot path
// for Objective-C code that we don't want to use
// DeclarationName::getAsString().
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits