diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 29f9cf3a7f0e3..ff3aec59f321c 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -1323,11 +1323,6 @@ static void parseAnalyzerConfigs(AnalyzerOptions &AnOpts, if (!AnOpts.CTUDir.empty() && !llvm::sys::fs::is_directory(AnOpts.CTUDir)) Diags->Report(diag::err_analyzer_config_invalid_input) << "ctu-dir" << "a filename"; - - if (!AnOpts.ModelPath.empty() && - !llvm::sys::fs::is_directory(AnOpts.ModelPath)) - Diags->Report(diag::err_analyzer_config_invalid_input) << "model-path" - << "a filename"; } /// Generate a remark argument. This is an inverse of `ParseOptimizationRemark`. diff --git a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp index 7bc34f61255f4..975c72af0b031 100644 --- a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp +++ b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp @@ -9,6 +9,7 @@ #include "ModelInjector.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" +#include "clang/Basic/DiagnosticDriver.h" #include "clang/Basic/LangStandard.h" #include "clang/Basic/Stack.h" #include "clang/Frontend/ASTUnit.h" @@ -24,7 +25,15 @@ using namespace clang; using namespace ento; -ModelInjector::ModelInjector(CompilerInstance &CI) : CI(CI) {} +ModelInjector::ModelInjector(CompilerInstance &CI) : CI(CI) { + if (CI.getAnalyzerOpts().ShouldEmitErrorsOnInvalidConfigValue && + !CI.getAnalyzerOpts().ModelPath.empty()) { + auto S = CI.getVirtualFileSystem().status(CI.getAnalyzerOpts().ModelPath); + if (!S || S->getType() != llvm::sys::fs::file_type::directory_file) + CI.getDiagnostics().Report(diag::err_analyzer_config_invalid_input) + << "model-path" << "a filename"; + } +} Stmt *ModelInjector::getBody(const FunctionDecl *D) { onBodySynthesis(D); diff --git a/clang/test/Analysis/model-file-missing.cpp b/clang/test/Analysis/model-file-missing.cpp new file mode 100644 index 0000000000000..c9dfb4ec1b244 --- /dev/null +++ b/clang/test/Analysis/model-file-missing.cpp @@ -0,0 +1,3 @@ +// RUN: not %clang_analyze_cc1 -analyzer-checker=core -analyzer-config model-path=%t/blah %s -o - 2>&1 | FileCheck %s +// CHECK: error: invalid input for analyzer-config option 'model-path', that expects a filename value +// CHECK-NEXT: 1 error generated