30 auto HasOptionalCallDescendant = hasDescendant(callExpr(callee(cxxMethodDecl(
31 ofClass(UncheckedOptionalAccessModel::optionalClassDecl())))));
33 decl(anyOf(functionDecl(unless(isExpansionInSystemHeader()),
36 unless(hasDeclContext(cxxRecordDecl(isLambda()))),
37 hasBody(HasOptionalCallDescendant)),
38 cxxConstructorDecl(hasAnyConstructorInitializer(
39 withInitializer(HasOptionalCallDescendant)))))
45 const MatchFinder::MatchResult &Result) {
46 if (Result.SourceManager->getDiagnostics().hasUncompilableErrorOccurred())
49 const auto *
FuncDecl = Result.Nodes.getNodeAs<FunctionDecl>(
FuncID);
53 UncheckedOptionalAccessDiagnoser Diagnoser(ModelOptions);
56 if (llvm::Expected<llvm::SmallVector<UncheckedOptionalAccessDiagnostic>>
57 Diags = dataflow::diagnoseFunction<UncheckedOptionalAccessModel,
58 UncheckedOptionalAccessDiagnostic>(
59 *
FuncDecl, *Result.Context, Diagnoser))
60 for (
const UncheckedOptionalAccessDiagnostic &Diag : *Diags) {
61 diag(Diag.Range.getBegin(),
"unchecked access to optional value")
65 llvm::consumeError(Diags.takeError());