30 auto HasOptionalCallDescendant = hasDescendant(callExpr(
31 anyOf(UncheckedOptionalAccessModel::memberCallToOptionalClass(),
32 UncheckedOptionalAccessModel::operatorCallToOptionalClass())));
34 decl(anyOf(functionDecl(
37 unless(hasDeclContext(cxxRecordDecl(isLambda()))),
38 hasBody(HasOptionalCallDescendant)),
39 cxxConstructorDecl(hasAnyConstructorInitializer(
40 withInitializer(HasOptionalCallDescendant)))))
46 const MatchFinder::MatchResult &Result) {
47 if (Result.SourceManager->getDiagnostics().hasUncompilableErrorOccurred())
50 const auto *
FuncDecl = Result.Nodes.getNodeAs<FunctionDecl>(
FuncID);
54 UncheckedOptionalAccessDiagnoser Diagnoser(ModelOptions);
58 dataflow::diagnoseFunction<UncheckedOptionalAccessModel,
59 UncheckedOptionalAccessDiagnostic>(
60 *
FuncDecl, *Result.Context, Diagnoser))
61 for (
const UncheckedOptionalAccessDiagnostic &Diag : *Diags) {
62 diag(Diag.Range.getBegin(),
"unchecked access to optional value")
66 llvm::consumeError(Diags.takeError());