浏览代码

[arcmt/objcmt] Fix ParentMap crash with invalid code.

rdar://22489560

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@275466 91177308-0d34-0410-b5e6-96231b3b80d8
Argyrios Kyrtzidis 9 年之前
父节点
当前提交
a874687b9f
共有 3 个文件被更改,包括 40 次插入0 次删除
  1. 2 0
      lib/AST/ParentMap.cpp
  2. 19 0
      test/ARCMT/objcmt-invalid-code.mm
  3. 19 0
      test/ARCMT/objcmt-invalid-code.mm.result

+ 2 - 0
lib/AST/ParentMap.cpp

@@ -28,6 +28,8 @@ enum OpaqueValueMode {
 
 static void BuildParentMap(MapTy& M, Stmt* S,
                            OpaqueValueMode OVMode = OV_Transparent) {
+  if (!S)
+    return;
 
   switch (S->getStmtClass()) {
   case Stmt::PseudoObjectExprClass: {

+ 19 - 0
test/ARCMT/objcmt-invalid-code.mm

@@ -0,0 +1,19 @@
+// REQUIRES: x86-registered-target
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only %s -verify
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+
+// Make sure there is no crash.
+
+@interface NSObject @end
+@interface NSNumber : NSObject
+@end
+
+@interface NSNumber (NSNumberCreation)
++ (NSNumber *)numberWithInt:(int)value;
+@end
+
+void foo(int x = undeclared) { // expected-error {{undeclared}}
+  NSNumber *n = [NSNumber numberWithInt:1];
+}

+ 19 - 0
test/ARCMT/objcmt-invalid-code.mm.result

@@ -0,0 +1,19 @@
+// REQUIRES: x86-registered-target
+// RUN: rm -rf %t
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only %s -verify
+// RUN: not %clang_cc1 -triple x86_64-apple-darwin10 -objcmt-migrate-literals -objcmt-migrate-subscripting -mt-migrate-directory %t %s -x objective-c
+// RUN: c-arcmt-test -mt-migrate-directory %t | arcmt-test -verify-transformed-files %s.result
+
+// Make sure there is no crash.
+
+@interface NSObject @end
+@interface NSNumber : NSObject
+@end
+
+@interface NSNumber (NSNumberCreation)
++ (NSNumber *)numberWithInt:(int)value;
+@end
+
+void foo(int x = undeclared) { // expected-error {{undeclared}}
+  NSNumber *n = @1;
+}