diff options
Diffstat (limited to 'test/FixIt')
-rw-r--r-- | test/FixIt/Inputs/nullability-objc.h | 48 | ||||
-rw-r--r-- | test/FixIt/fixit-availability.c | 8 | ||||
-rw-r--r-- | test/FixIt/fixit-availability.mm | 39 | ||||
-rw-r--r-- | test/FixIt/fixit-cxx0x.cpp | 1 | ||||
-rw-r--r-- | test/FixIt/fixit-format-ios.m | 26 | ||||
-rw-r--r-- | test/FixIt/fixit-include.c | 11 | ||||
-rw-r--r-- | test/FixIt/fixit-pragma-pack.c | 5 | ||||
-rw-r--r-- | test/FixIt/fixit-vexing-parse.cpp | 21 | ||||
-rw-r--r-- | test/FixIt/format.m | 31 | ||||
-rw-r--r-- | test/FixIt/nullability.mm | 2 |
10 files changed, 186 insertions, 6 deletions
diff --git a/test/FixIt/Inputs/nullability-objc.h b/test/FixIt/Inputs/nullability-objc.h new file mode 100644 index 0000000000000..e3e6baafd66d3 --- /dev/null +++ b/test/FixIt/Inputs/nullability-objc.h @@ -0,0 +1,48 @@ +@class Item; +@class Container<ObjectType>; +@protocol Protocol; + +// rdar://problem/34260995 +// The first pointer in the file is handled in a different way so need +// a separate test for this case even if the parameter type is the same as in +// objcIdParameterWithProtocol. +void objcIdParameterWithProtocolFirstInFile(id<Protocol> i); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:57-[[@LINE-3]]:57}:" _Nullable" +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:57-[[@LINE-4]]:57}:" _Nonnull" + +int * _Nonnull forceNullabilityWarningsObjC(void); + +void objcClassParameter(Item *i); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:31-[[@LINE-3]]:31}:" _Nullable " +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:31-[[@LINE-4]]:31}:" _Nonnull " + +void objcClassParameterWithProtocol(Item<Protocol> *i); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:53-[[@LINE-3]]:53}:" _Nullable " +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:53-[[@LINE-4]]:53}:" _Nonnull " + +// rdar://problem/34260995 +void objcIdParameterWithProtocol(id<Protocol> i); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:46-[[@LINE-3]]:46}:" _Nullable" +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:46-[[@LINE-4]]:46}:" _Nonnull" + +// Class parameters don't have nullability type specifier. +void objcParameterizedClassParameter(Container<Item *> *c); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:57-[[@LINE-3]]:57}:" _Nullable " +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:57-[[@LINE-4]]:57}:" _Nonnull " + +// Class parameters don't have nullability type specifier. +void objcParameterizedClassParameterWithProtocol(Container<id<Protocol>> *c); // expected-warning {{pointer is missing a nullability type specifier}} +// expected-note@-1 {{insert '_Nullable'}} +// expected-note@-2 {{insert '_Nonnull'}} +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-3]]:75-[[@LINE-3]]:75}:" _Nullable " +// CHECK: fix-it:"{{.*}}nullability-objc.h":{[[@LINE-4]]:75-[[@LINE-4]]:75}:" _Nonnull " diff --git a/test/FixIt/fixit-availability.c b/test/FixIt/fixit-availability.c index 038dee08b13c7..4b3c8a43920d1 100644 --- a/test/FixIt/fixit-availability.c +++ b/test/FixIt/fixit-availability.c @@ -8,3 +8,11 @@ void use() { // CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (__builtin_available(macOS 10.12, *)) {\n " // CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:14-[[@LINE-2]]:14}:"\n } else {\n // Fallback on earlier versions\n }" } + +__attribute__((availability(macos, introduced=10.12))) +struct New { }; + +struct NoFixit { + struct New field; +}; +// CHECK-NOT: API_AVAILABLE diff --git a/test/FixIt/fixit-availability.mm b/test/FixIt/fixit-availability.mm index d044a73efdb9f..a5660825327f7 100644 --- a/test/FixIt/fixit-availability.mm +++ b/test/FixIt/fixit-availability.mm @@ -108,4 +108,43 @@ void wrapDeclStmtUses() { // CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:24-[[@LINE-2]]:24}:"\n } else {\n // Fallback on earlier versions\n }" anotherFunction(y); anotherFunction(x); + + if (@available(macOS 10.1, *)) { + int z = function(); + (void)z; +// CHECK: fix-it:{{.*}}:{[[@LINE-2]]:5-[[@LINE-2]]:5}:"if (@available(macOS 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:13-[[@LINE-2]]:13}:"\n } else {\n // Fallback on earlier versions\n }" + anotherFunction(x); + } } + +#define API_AVAILABLE(X) __attribute__((availability(macos, introduced=10.12))) // dummy macro + +API_AVAILABLE(macos(10.12)) +@interface NewClass +@end + +@interface OldButOfferFixit +@property(copy) NewClass *prop; +// CHECK: fix-it:{{.*}}:{[[@LINE-2]]:1-[[@LINE-2]]:1}:"API_AVAILABLE(macos(10.12))\n" + +- (NewClass *)fixitMe; +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:22-[[@LINE-1]]:22}:" API_AVAILABLE(macos(10.12))" +@end + +void oldButOfferFixitFn(NewClass *) { +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:1-[[@LINE-1]]:1}:"API_AVAILABLE(macos(10.12))\n" +} + +template<typename T> +struct OldButOfferFixitTag { +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:7-[[@LINE-1]]:7}:" API_AVAILABLE(macos(10.12))" + NewClass *x; +}; + +// Avoid a fixit for declarations that already have an attribute: +__attribute__((availability(macos, introduced=10.11))) +@interface WithoutFixit +@property(copy) NewClass *prop; +// CHECK-NOT: API_AVAILABLE +@end diff --git a/test/FixIt/fixit-cxx0x.cpp b/test/FixIt/fixit-cxx0x.cpp index 5aebcb3defaa6..337b5d62bed70 100644 --- a/test/FixIt/fixit-cxx0x.cpp +++ b/test/FixIt/fixit-cxx0x.cpp @@ -54,7 +54,6 @@ struct S2 { void S2::f(int i) { (void)[&, &i, &i]{}; // expected-error 2{{'&' cannot precede a capture when the capture default is '&'}} - (void)[=, this]{ this->g(5); }; // expected-error{{'this' cannot be explicitly captured}} (void)[i, i]{ }; // expected-error{{'i' can appear only once in a capture list}} (void)[&, i, i]{ }; // expected-error{{'i' can appear only once in a capture list}} (void)[] mutable { }; // expected-error{{lambda requires '()' before 'mutable'}} diff --git a/test/FixIt/fixit-format-ios.m b/test/FixIt/fixit-format-ios.m new file mode 100644 index 0000000000000..ef66430778696 --- /dev/null +++ b/test/FixIt/fixit-format-ios.m @@ -0,0 +1,26 @@ +// RUN: cp %s %t +// RUN: %clang_cc1 -triple thumbv7-apple-ios8.0.0 -fsyntax-only -Wformat -fixit %t +// RUN: grep -v CHECK %t | FileCheck %s + +int printf(const char * restrict, ...); +typedef unsigned int NSUInteger; +typedef int NSInteger; +NSUInteger getNSUInteger(); +NSInteger getNSInteger(); + +void test() { + // For thumbv7-apple-ios8.0.0 the underlying type of ssize_t is long + // and the underlying type of size_t is unsigned long. + + printf("test 1: %zu", getNSUInteger()); + // CHECK: printf("test 1: %lu", (unsigned long)getNSUInteger()); + + printf("test 2: %zu %zu", getNSUInteger(), getNSUInteger()); + // CHECK: printf("test 2: %lu %lu", (unsigned long)getNSUInteger(), (unsigned long)getNSUInteger()); + + printf("test 3: %zd", getNSInteger()); + // CHECK: printf("test 3: %ld", (long)getNSInteger()); + + printf("test 4: %zd %zd", getNSInteger(), getNSInteger()); + // CHECK: printf("test 4: %ld %ld", (long)getNSInteger(), (long)getNSInteger()); +} diff --git a/test/FixIt/fixit-include.c b/test/FixIt/fixit-include.c index fd5d7a9ac1426..455455687c0de 100644 --- a/test/FixIt/fixit-include.c +++ b/test/FixIt/fixit-include.c @@ -1,12 +1,13 @@ // RUN: %clang_cc1 -fsyntax-only -Wall -pedantic -verify %s -// RUN: cp %s %t -// RUN: cp %S/fixit-include.h %T -// RUN: not %clang_cc1 -fsyntax-only -fixit %t -// RUN: %clang_cc1 -Wall -pedantic %t +// RUN: mkdir -p %t-dir +// RUN: cp %s %t-dir/fixit-include.c +// RUN: cp %S/fixit-include.h %t-dir/fixit-include.h +// RUN: not %clang_cc1 -fsyntax-only -fixit %t-dir/fixit-include.c +// RUN: %clang_cc1 -Wall -pedantic %t-dir/fixit-include.c // RUN: not %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s #include <fixit-include.h> // expected-error {{'fixit-include.h' file not found with <angled> include; use "quotes" instead}} -// CHECK: fix-it:{{.*}}:{8:10-8:27} +// CHECK: fix-it:{{.*}}:{9:10-9:27} #pragma does_not_exist // expected-warning {{unknown pragma ignored}} diff --git a/test/FixIt/fixit-pragma-pack.c b/test/FixIt/fixit-pragma-pack.c new file mode 100644 index 0000000000000..acab4a8bb4348 --- /dev/null +++ b/test/FixIt/fixit-pragma-pack.c @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s + +#pragma pack (push, 1) +#pragma pack() +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:14-[[@LINE-1]]:14}:"pop" diff --git a/test/FixIt/fixit-vexing-parse.cpp b/test/FixIt/fixit-vexing-parse.cpp index 71d3eff5329ad..973c6961a0879 100644 --- a/test/FixIt/fixit-vexing-parse.cpp +++ b/test/FixIt/fixit-vexing-parse.cpp @@ -106,3 +106,24 @@ namespace N { wchar_t wc(); // expected-warning {{function declaration}} expected-note {{replace parentheses with an initializer}} } } + +namespace RedundantParens { +struct Y { + Y(); + Y(int); + ~Y(); +}; +int n; + +void test() { + // CHECK: add a variable name + // CHECK: fix-it:"{{.*}}":{[[@LINE+7]]:4-[[@LINE+7]]:4}:" varname" + // CHECK: add enclosing parentheses + // CHECK: fix-it:"{{.*}}":{[[@LINE+5]]:3-[[@LINE+5]]:3}:"(" + // CHECK: fix-it:"{{.*}}":{[[@LINE+4]]:7-[[@LINE+4]]:7}:")" + // CHECK: remove parentheses + // CHECK: fix-it:"{{.*}}":{[[@LINE+2]]:4-[[@LINE+2]]:5}:" " + // CHECK: fix-it:"{{.*}}":{[[@LINE+1]]:6-[[@LINE+1]]:7}:"" + Y(n); // expected-warning {{declaration of variable named 'n'}} expected-note 3{{}} +} +} diff --git a/test/FixIt/format.m b/test/FixIt/format.m index c3cf2b1f3c567..40655a0e808ef 100644 --- a/test/FixIt/format.m +++ b/test/FixIt/format.m @@ -242,6 +242,37 @@ void testSizeTypes() { // see the comment in PrintfSpecifier::fixType in PrintfFormatString.cpp. } +typedef __PTRDIFF_TYPE__ ptrdiff_t; +#define __UNSIGNED_PTRDIFF_TYPE__ \ + __typeof__(_Generic((__PTRDIFF_TYPE__)0, \ + long long int : (unsigned long long int)0, \ + long int : (unsigned long int)0, \ + int : (unsigned int)0, \ + short : (unsigned short)0, \ + signed char : (unsigned char)0)) + +void testPtrDiffTypes() { + __UNSIGNED_PTRDIFF_TYPE__ p1 = 0; + printf("%tu", p1); // No warning. + + printf("%tu", 0.f); // expected-warning-re{{format specifies type 'unsigned ptrdiff_t' (aka '{{.+}}') but the argument has type 'float'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%f" + + ptrdiff_t p2 = 0; + printf("%td", p2); // No warning. + + printf("%td", 0.f); // expected-warning-re{{format specifies type 'ptrdiff_t' (aka '{{.+}}') but the argument has type 'float'}} + // CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:14}:"%f" + + ptrdiff_t p3 = 0; + printf("%tn", &p3); // No warning. + + short x; + printf("%tn", &x); // expected-warning-re{{format specifies type 'ptrdiff_t *' (aka '{{.+}}') but the argument has type 'short *'}} + // PrintfSpecifier::fixType doesn't handle %n, so a fix-it is not emitted, + // see the comment in PrintfSpecifier::fixType in PrintfFormatString.cpp. +} + void testEnum() { typedef enum { ImplicitA = 1, diff --git a/test/FixIt/nullability.mm b/test/FixIt/nullability.mm index 815c84419243c..a91ccc0f5f640 100644 --- a/test/FixIt/nullability.mm +++ b/test/FixIt/nullability.mm @@ -2,8 +2,10 @@ // RUN: not %clang_cc1 -fdiagnostics-parseable-fixits -fblocks -std=gnu++11 -I %S/Inputs %s >%t.txt 2>&1 // RUN: FileCheck %s < %t.txt // RUN: FileCheck %S/Inputs/nullability.h < %t.txt +// RUN: FileCheck %S/Inputs/nullability-objc.h < %t.txt #include "nullability.h" +#include "nullability-objc.h" #pragma clang assume_nonnull begin |