https://github.com/chestnykh updated https://github.com/llvm/llvm-project/pull/98439
>From 716e8b7b71422b5850d2f9c3710a28bcf18ffccb Mon Sep 17 00:00:00 2001 From: Dmitry Chestnykh <dm.chestn...@gmail.com> Date: Thu, 11 Jul 2024 09:55:55 +0300 Subject: [PATCH 1/2] [Clang] Don't crash if input file is not a module. Currently clang crashes with `-module-file-info` and input file which is not a module Emit error instead of segfaulting. Fix #98365 --- clang/include/clang/Basic/DiagnosticFrontendKinds.td | 1 + clang/lib/Frontend/FrontendActions.cpp | 10 ++++++++-- clang/test/Frontend/module-file-info-not-a-module.c | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 clang/test/Frontend/module-file-info-not-a-module.c diff --git a/clang/include/clang/Basic/DiagnosticFrontendKinds.td b/clang/include/clang/Basic/DiagnosticFrontendKinds.td index 85c32e55bdab3..029ae6457699e 100644 --- a/clang/include/clang/Basic/DiagnosticFrontendKinds.td +++ b/clang/include/clang/Basic/DiagnosticFrontendKinds.td @@ -226,6 +226,7 @@ def err_module_map_not_found : Error<"module map file '%0' not found">, def err_missing_module_name : Error< "no module name provided; specify one with -fmodule-name=">, DefaultFatal; +def err_file_is_not_module : Error<"file '%0' is not a module">, DefaultFatal; def err_missing_module : Error< "no module named '%0' declared in module map file '%1'">, DefaultFatal; def err_no_submodule : Error<"no submodule named %0 in module '%1'">; diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index 4f064321997a2..ddefa07569c55 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -841,9 +841,15 @@ static StringRef ModuleKindName(Module::ModuleKind MK) { } void DumpModuleInfoAction::ExecuteAction() { - assert(isCurrentFileAST() && "dumping non-AST?"); - // Set up the output file. CompilerInstance &CI = getCompilerInstance(); + + // Don't process files of type other than module to avoid crash + if (!isCurrentFileAST()) { + CI.getDiagnostics().Report(diag::err_file_is_not_module) << getCurrentFile(); + return; + } + + // Set up the output file. StringRef OutputFileName = CI.getFrontendOpts().OutputFile; if (!OutputFileName.empty() && OutputFileName != "-") { std::error_code EC; diff --git a/clang/test/Frontend/module-file-info-not-a-module.c b/clang/test/Frontend/module-file-info-not-a-module.c new file mode 100644 index 0000000000000..67eba2a27051b --- /dev/null +++ b/clang/test/Frontend/module-file-info-not-a-module.c @@ -0,0 +1,3 @@ +// RUN: not %clang_cc1 -module-file-info %s 2>&1 | FileCheck %s + +// CHECK: fatal error: file '{{.*}}module-file-info-not-a-module.c' is not a module >From 7995f5cccc3068f6b2831f20f1b4519fe0cd924b Mon Sep 17 00:00:00 2001 From: Dmitry Chestnykh <dm.chestn...@gmail.com> Date: Thu, 11 Jul 2024 10:00:31 +0300 Subject: [PATCH 2/2] [Clang] Correct code style --- clang/lib/Frontend/FrontendActions.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/Frontend/FrontendActions.cpp b/clang/lib/Frontend/FrontendActions.cpp index ddefa07569c55..e70210d55fe28 100644 --- a/clang/lib/Frontend/FrontendActions.cpp +++ b/clang/lib/Frontend/FrontendActions.cpp @@ -845,7 +845,8 @@ void DumpModuleInfoAction::ExecuteAction() { // Don't process files of type other than module to avoid crash if (!isCurrentFileAST()) { - CI.getDiagnostics().Report(diag::err_file_is_not_module) << getCurrentFile(); + CI.getDiagnostics().Report(diag::err_file_is_not_module) + << getCurrentFile(); return; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits