49 lines · plain
1// RUN: %clang_analyze_cc1 -verify -Wno-objc-root-class %s \2// RUN: -Wno-tautological-pointer-compare \3// RUN: -analyzer-checker=core \4// RUN: -analyzer-checker=nullability \5// RUN: -analyzer-checker=debug.ExprInspection6 7void clang_analyzer_eval(int);8 9@interface TestFunctionLevelAnnotations10- (void)method1:(int *_Nonnull)x;11- (void)method2:(int *)x __attribute__((nonnull));12@end13 14@implementation TestFunctionLevelAnnotations15- (void)method1:(int *_Nonnull)x {16 clang_analyzer_eval(x != 0); // expected-warning{{TRUE}}17}18 19- (void)method2:(int *)x {20 clang_analyzer_eval(x != 0); // expected-warning{{TRUE}}21}22@end23 24typedef struct NestedNonnullMember {25 struct NestedNonnullMember *Child;26 int *_Nonnull Value;27} NestedNonnullMember;28 29NestedNonnullMember *foo(void);30 31void f1(NestedNonnullMember *Root) {32 NestedNonnullMember *Grandson = Root->Child->Child;33 34 clang_analyzer_eval(Root->Value != 0); // expected-warning{{TRUE}}35 clang_analyzer_eval(Grandson->Value != 0); // expected-warning{{TRUE}}36 clang_analyzer_eval(foo()->Child->Value != 0); // expected-warning{{TRUE}}37}38 39// Check that we correctly process situations when non-pointer parameters40// get nonnul attributes.41typedef struct {42 long a;43} B;44__attribute__((nonnull)) void c(B x, int *y);45 46void c(B x, int *y) {47 clang_analyzer_eval(y != 0); // expected-warning{{TRUE}}48}49