diff --git a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp index 35620d33acf19..d8a224ea2f458 100644 --- a/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/NullabilityChecker.cpp @@ -562,7 +562,8 @@ void NullabilityChecker::checkPreStmt(const ReturnStmt *S, if (Filter.CheckNullReturnedFromNonnull && NullReturnedFromNonNull && RetExprTypeLevelNullability != Nullability::Nonnull && - !InSuppressedMethodFamily) { + !InSuppressedMethodFamily && + C.getLocationContext()->inTopFrame()) { static CheckerProgramPointTag Tag(this, "NullReturnedFromNonnull"); ExplodedNode *N = C.generateErrorNode(State, &Tag); if (!N) diff --git a/clang/test/Analysis/nullability.mm b/clang/test/Analysis/nullability.mm index 0a3ae7a1968c6..1e01cdf4ca6ba 100644 --- a/clang/test/Analysis/nullability.mm +++ b/clang/test/Analysis/nullability.mm @@ -238,6 +238,41 @@ void testPreconditionViolationInInlinedFunction(Dummy *p) { doNotWarnWhenPreconditionIsViolated(p); } +@interface TestInlinedPreconditionViolationClass : NSObject +@end + +@implementation TestInlinedPreconditionViolationClass +-(Dummy * _Nonnull) calleeWithParam:(Dummy * _Nonnull) p2 { + Dummy *x = 0; + if (!p2) // p2 binding becomes dead at this point. + return x; // no-warning + else + return p2; +} + +-(Dummy *)callerWithParam:(Dummy * _Nonnull) p1 { + return [self calleeWithParam:p1]; +} + +@end + +int * _Nonnull InlinedPreconditionViolationInFunctionCallee(int * _Nonnull p2) { + int *x = 0; + if (!p2) // p2 binding becomes dead at this point. + return x; // no-warning + else + return p2; +} + +int * _Nonnull InlinedReturnNullOverSuppressionCallee(int * _Nonnull p2) { + int *result = 0; + return result; // no-warning; but this is an over suppression +} + +int *InlinedReturnNullOverSuppressionCaller(int * _Nonnull p1) { + return InlinedReturnNullOverSuppressionCallee(p1); +} + void inlinedNullable(Dummy *_Nullable p) { if (p) return; }