diff options
author | Jordan Rose <jordan_rose@apple.com> | 2016-11-10 23:28:30 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2016-11-10 23:28:30 +0000 |
commit | 3b917fe019fff717f9b92defb8ec14601090381f (patch) | |
tree | f3feb3456cc7f8f0b83f66728ad7312bcb588816 /clang/test/FixIt/nullability.mm | |
parent | f85a9b06b826f1081f121156def4fb3ab9aa6ac3 (diff) | |
download | bcm5719-llvm-3b917fe019fff717f9b92defb8ec14601090381f.tar.gz bcm5719-llvm-3b917fe019fff717f9b92defb8ec14601090381f.zip |
Warn when 'assume_nonnull' infers nullability within an array.
...or within a reference. Both of these add an extra level of
indirection that make us less certain that the pointer really was
supposed to be non-nullable. However, changing the default behavior
would be a breaking change, so we'll just make it a warning instead.
Part of rdar://problem/25846421
llvm-svn: 286521
Diffstat (limited to 'clang/test/FixIt/nullability.mm')
-rw-r--r-- | clang/test/FixIt/nullability.mm | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/clang/test/FixIt/nullability.mm b/clang/test/FixIt/nullability.mm new file mode 100644 index 00000000000..244906601fe --- /dev/null +++ b/clang/test/FixIt/nullability.mm @@ -0,0 +1,68 @@ +// RUN: %clang_cc1 -fsyntax-only -fblocks -std=gnu++11 -verify %s +// RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -fblocks -std=gnu++11 %s 2>&1 | FileCheck %s + +#pragma clang assume_nonnull begin + +extern void *array[2]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:" _Nonnull " + +extern void* array2[2]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:13-[[@LINE-1]]:13}:" _Nonnull" + +extern void *nestedArray[2][3]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:" _Nonnull " + + +typedef const void *CFTypeRef; + +extern CFTypeRef typedefArray[2]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:" _Nonnull" + + +extern void *&ref; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"_Nonnull" + +extern void * &ref2; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:" _Nonnull" + +extern void *&&ref3; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"_Nonnull" + +extern void * &&ref4; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:" _Nonnull" + +extern void *(&arrayRef)[2]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:"_Nonnull" + +extern void * (&arrayRef2)[2]; // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:14-[[@LINE-1]]:14}:" _Nonnull" + +extern CFTypeRef &typedefRef; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:" _Nonnull" +extern CFTypeRef& typedefRef2; // expected-warning {{inferring '_Nonnull' for pointer type within reference is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:17-[[@LINE-1]]:17}:" _Nonnull " + + +void arrayNameless(void *[]); // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:26-[[@LINE-1]]:26}:"_Nonnull" + +void arrayNameless2(void * []); // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:27-[[@LINE-1]]:27}:" _Nonnull" + +void arrayNamelessTypedef(CFTypeRef[]); // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:36-[[@LINE-1]]:36}:" _Nonnull " + +void arrayNamelessTypedef2(CFTypeRef []); // expected-warning {{inferring '_Nonnull' for pointer type within array is deprecated}} +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:37-[[@LINE-1]]:37}:" _Nonnull" + + +extern int (*pointerToArray)[2]; // no-warning +int checkTypePTA = pointerToArray; // expected-error {{cannot initialize a variable of type 'int' with an lvalue of type 'int (* _Nonnull)[2]'}} + +int **arrayOfNestedPointers[2]; // no-warning +int checkTypeANP = arrayOfNestedPointers; // expected-error {{cannot initialize a variable of type 'int' with an lvalue of type 'int **[2]'}} + +CFTypeRef *arrayOfNestedPointersTypedef[2]; // no-warning +int checkTypeANPT = arrayOfNestedPointersTypedef; // expected-error {{cannot initialize a variable of type 'int' with an lvalue of type 'CFTypeRef *[2]'}} + +#pragma clang assume_nonnull end |