[clang-cl] Ignore /Wv and /Wv:17 flags
[llvm-project.git] / clang / test / Analysis / trustnonnullchecker_test.m
blobcb0c1cdcab61a09bebb4f42f2523b31e3e1337ef
1 // Temporarily disabling the test, it failes the "system is over-constrained" (part of expensive checks)
2 // assertion in *non* optimized builds.
3 // REQUIRES: rdar44992170
4 // RUN: %clang_analyze_cc1 -fblocks -analyze -analyzer-checker=core,nullability,apiModeling,debug.ExprInspection  -verify %s
6 #include "Inputs/system-header-simulator-for-nullability.h"
8 void clang_analyzer_warnIfReached(void);
10 NSString* _Nonnull trust_nonnull_framework_annotation(void) {
11   NSString* out = [NSString generateString];
12   if (out) {}
13   return out; // no-warning
16 NSString* _Nonnull trust_instancemsg_annotation(NSString* _Nonnull param) {
17   NSString* out = [param stringByAppendingString:@"string"];
18   if (out) {}
19   return out; // no-warning
22 NSString* _Nonnull distrust_instancemsg_noannotation(NSString* param) {
23   if (param) {}
24   NSString* out = [param stringByAppendingString:@"string"];
25   if (out) {}
26   return out; // expected-warning{{}}
29 NSString* _Nonnull trust_analyzer_knowledge(NSString* param) {
30   if (!param)
31     return @"";
32   NSString* out = [param stringByAppendingString:@"string"];
33   if (out) {}
34   return out; // no-warning
37 NSString* _Nonnull trust_assume_nonnull_macro(void) {
38   NSString* out = [NSString generateImplicitlyNonnullString];
39   if (out) {}
40   return out; // no-warning
43 NSString* _Nonnull distrust_without_annotation(void) {
44   NSString* out = [NSString generatePossiblyNullString];
45   if (out) {}
46   return out; // expected-warning{{}}
49 NSString* _Nonnull nonnull_please_trust_me(void);
51 NSString* _Nonnull distrust_local_nonnull_annotation(void) {
52   NSString* out = nonnull_please_trust_me();
53   if (out) {}
54   return out; // expected-warning{{}}
57 NSString* _Nonnull trust_c_function(void) {
58   NSString* out = getString();
59   if (out) {};
60   return out; // no-warning
63 NSString* _Nonnull distrust_unannoted_function(void) {
64   NSString* out = getPossiblyNullString();
65   if (out) {};
66   return out; // expected-warning{{}}
69 NSString * _Nonnull distrustProtocol(id<MyProtocol> o) {
70   NSString* out = [o getString];
71   if (out) {};
72   return out; // expected-warning{{}}
75 // If the return value is non-nil, the index is non-nil.
76 NSString *_Nonnull retImpliesIndex(NSString *s,
77                                    NSDictionary *dic) {
78   id obj = dic[s];
79   if (s) {}
80   if (obj)
81     return s; // no-warning
82   return @"foo";
85 NSString *_Nonnull retImpliesIndexOtherMethod(NSString *s,
86                                    NSDictionary *dic) {
87   id obj = [dic objectForKey:s];
88   if (s) {}
89   if (obj)
90     return s; // no-warning
91   return @"foo";
94 NSString *_Nonnull retImpliesIndexOnRHS(NSString *s,
95                                         NSDictionary *dic) {
96   id obj = dic[s];
97   if (s) {}
98   if (nil != obj)
99     return s; // no-warning
100   return @"foo";
103 NSString *_Nonnull retImpliesIndexReverseCheck(NSString *s,
104                                                NSDictionary *dic) {
105   id obj = dic[s];
106   if (s) {}
107   if (!obj)
108     return @"foo";
109   return s; // no-warning
112 NSString *_Nonnull retImpliesIndexReverseCheckOnRHS(NSString *s,
113                                                     NSDictionary *dic) {
114   id obj = dic[s];
115   if (s) {}
116   if (nil == obj)
117     return @"foo";
118   return s; // no-warning
121 NSString *_Nonnull retImpliesIndexWrongBranch(NSString *s,
122                                               NSDictionary *dic) {
123   id obj = dic[s];
124   if (s) {}
125   if (!obj)
126     return s; // expected-warning{{}}
127   return @"foo";
130 NSString *_Nonnull retImpliesIndexWrongBranchOnRHS(NSString *s,
131                                                    NSDictionary *dic) {
132   id obj = dic[s];
133   if (s) {}
134   if (nil == obj)
135     return s; // expected-warning{{}}
136   return @"foo";
139 // The return value could still be nil for a non-nil index.
140 NSDictionary *_Nonnull indexDoesNotImplyRet(NSString *s,
141                                             NSDictionary *dic) {
142   id obj = dic[s];
143   if (obj) {}
144   if (s)
145     return obj; // expected-warning{{}}
146   return [[NSDictionary alloc] init];
149 // The return value could still be nil for a non-nil index.
150 NSDictionary *_Nonnull notIndexImpliesNotRet(NSString *s,
151                                              NSDictionary *dic) {
152   id obj = dic[s];
153   if (!s) {
154     if (obj != nil) {
155       clang_analyzer_warnIfReached(); // no-warning
156     }
157   }
158   return [[NSDictionary alloc] init];
161 NSString *_Nonnull checkAssumeOnMutableDictionary(NSMutableDictionary *d,
162                                                   NSString *k,
163                                                   NSString *val) {
164   d[k] = val;
165   if (k) {}
166   return k; // no-warning
169 NSString *_Nonnull checkAssumeOnMutableDictionaryOtherMethod(NSMutableDictionary *d,
170                                                              NSString *k,
171                                                              NSString *val) {
172   [d setObject:val forKey:k];
173   if (k) {}
174   return k; // no-warning
177 // Check that we don't crash when the added assumption is enough
178 // to make the state unfeasible.
179 @class DummyClass;
180 @interface DictionarySubclass : NSDictionary {
181   DummyClass *g;
182   DictionarySubclass *d;
184 @end
185 @implementation DictionarySubclass
186 - (id) objectForKey:(id)e {
187   if (e) {}
188   return d;
190 - (void) coder {
191   for (id e in g) {
192     id f = [self objectForKey:e];
193     if (f)
194       (void)e;
195   }
197 @end