blob: e3c2b6fb05d7a43bc472d620c6abff371d14a513 [file] [log] [blame]
Valeriy Savchenko1f675082020-04-20 11:08:57 +03001// RUN: %clang_analyze_cc1 -verify -Wno-objc-root-class %s \
2// RUN: -analyzer-checker=core \
3// RUN: -analyzer-checker=nullability \
4// RUN: -analyzer-checker=debug.ExprInspection
5
6void clang_analyzer_eval(int);
7
8@interface TestFunctionLevelAnnotations
9- (void)method1:(int *_Nonnull)x;
10- (void)method2:(int *)x __attribute__((nonnull));
11@end
12
13@implementation TestFunctionLevelAnnotations
14- (void)method1:(int *_Nonnull)x {
15 clang_analyzer_eval(x != 0); // expected-warning{{TRUE}}
16}
17
18- (void)method2:(int *)x {
19 clang_analyzer_eval(x != 0); // expected-warning{{TRUE}}
20}
21@end
22
23typedef struct NestedNonnullMember {
24 struct NestedNonnullMember *Child;
25 int *_Nonnull Value;
26} NestedNonnullMember;
27
28NestedNonnullMember *foo();
29
30void f1(NestedNonnullMember *Root) {
31 NestedNonnullMember *Grandson = Root->Child->Child;
32
33 clang_analyzer_eval(Root->Value != 0); // expected-warning{{TRUE}}
34 clang_analyzer_eval(Grandson->Value != 0); // expected-warning{{TRUE}}
35 clang_analyzer_eval(foo()->Child->Value != 0); // expected-warning{{TRUE}}
36}