]> granicus.if.org Git - clang/commitdiff
[SemaObjC] Do not RebuildObjCMessageExpr without valid method decl
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 22 Aug 2016 21:50:22 +0000 (21:50 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Mon, 22 Aug 2016 21:50:22 +0000 (21:50 +0000)
Fix crash-on-invalid in ObjC Sema by avoiding to rebuild a message
expression to a 'super' class in case the method to call does not exist
(i.e. comes from another missing identifier).

In this case, the typo transform is invoked upon the message expression
in an attempt to solve a typo in a 'super' call parameters, but it
crashes since it assumes the method to call has a valid declaration.

rdar://problem/27305403

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

lib/Sema/TreeTransform.h
test/SemaObjC/call-super-2.m

index 8ea0b015e5fbf057d51179ae6187c35e24742512..c53505d10ab13da171c19e9e429e62fc04617dad 100644 (file)
@@ -11174,6 +11174,9 @@ TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
   }
   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
+    if (!E->getMethodDecl())
+      return ExprError();
+
     // Build a new class message send to 'super'.
     SmallVector<SourceLocation, 16> SelLocs;
     E->getSelectorLocs(SelLocs);
index 8927f3b528648fa794edcae55e2b038dc27d675f..01acff70c2301257acc13ff2bbc9ef671d997ad6 100644 (file)
@@ -106,3 +106,18 @@ id objc_getClass(const char *s);
 }
 @end
 
+@class C;
+@interface A // expected-note {{receiver is instance of class declared here}}
+- (instancetype)initWithCoder:(A *)coder;
+@end
+
+@interface B : A
+@end
+
+@implementation B
+- (instancetype)initWithCoder:(C *)coder {
+  if (0 != (self = [super initWithCode:code])) // expected-error {{use of undeclared identifier 'code'}} expected-warning {{instance method '-initWithCode:' not found}}
+    return (void *)0;
+  return (void *)0;
+}
+@end