]> granicus.if.org Git - clang/commitdiff
Make PredefinedExpr::ComputeName() more robust to incorrect
authorTed Kremenek <kremenek@apple.com>
Thu, 18 Mar 2010 21:23:08 +0000 (21:23 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 18 Mar 2010 21:23:08 +0000 (21:23 +0000)
code when we are printing the name of an Objective-C method
whose class has not been declared.  Fixes <rdar://problem/7495713>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@98874 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
test/SemaObjC/invalid-code.m

index a62dbc901264831c5a2b50fdb02d5721d0b10382..6a71e925d9b3f8afde71c20102a4c89654b1caf0 100644 (file)
@@ -227,7 +227,12 @@ std::string PredefinedExpr::ComputeName(IdentType IT, const Decl *CurrentDecl) {
     llvm::raw_svector_ostream Out(Name);
     Out << (MD->isInstanceMethod() ? '-' : '+');
     Out << '[';
-    Out << MD->getClassInterface()->getNameAsString();
+
+    // For incorrect code, there might not be an ObjCInterfaceDecl.  Do
+    // a null check to avoid a crash.
+    if (const ObjCInterfaceDecl *ID = MD->getClassInterface())
+      Out << ID->getNameAsString();
+
     if (const ObjCCategoryImplDecl *CID =
         dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) {
       Out << '(';
index 9913a3a237c2cf843231762abd7234134be21268..2f297cf6e659552c793fa24179b2303129ca0b83 100644 (file)
@@ -5,3 +5,10 @@ void test1() {
   void *p = @1; // expected-error {{unexpected '@' in program}}
 }
 
+// <rdar://problem/7495713>
+// This previously triggered a crash because the class has not been defined.
+@implementation RDar7495713 (rdar_7495713_cat)  // expected-error{{cannot find interface declaration for 'RDar7495713'}}
+- (id) rdar_7495713 {
+  __PRETTY_FUNCTION__; // expected-warning{{expression result unused}}
+}
+@end