diff --git a/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp b/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp index 2efdd9223dfb..e5bd971a68c1 100644 --- a/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp +++ b/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp @@ -102,7 +102,7 @@ int main(int argc, const char **argv) { auto ExpectedParser = tooling::CommonOptionsParser::create(argc, argv, ChangeNamespaceCategory); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } tooling::CommonOptionsParser &OptionsParser = ExpectedParser.get(); diff --git a/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp b/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp index 6bac717bbb01..995006e18356 100644 --- a/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp +++ b/clang-tools-extra/clang-include-fixer/find-all-symbols/tool/FindAllSymbolsMain.cpp @@ -131,7 +131,7 @@ int main(int argc, const char **argv) { auto ExpectedParser = CommonOptionsParser::create(argc, argv, FindAllSymbolsCategory); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } diff --git a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp index 568cb2b83d79..f983b9d59054 100644 --- a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp +++ b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp @@ -264,7 +264,7 @@ int includeFixerMain(int argc, const char **argv) { auto ExpectedParser = tooling::CommonOptionsParser::create(argc, argv, IncludeFixerCategory); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } tooling::CommonOptionsParser &options = ExpectedParser.get(); diff --git a/clang-tools-extra/clang-move/tool/ClangMove.cpp b/clang-tools-extra/clang-move/tool/ClangMove.cpp index 1be3cb1e3b9c..d36ce89b611f 100644 --- a/clang-tools-extra/clang-move/tool/ClangMove.cpp +++ b/clang-tools-extra/clang-move/tool/ClangMove.cpp @@ -99,7 +99,7 @@ int main(int argc, const char **argv) { auto ExpectedParser = tooling::CommonOptionsParser::create(argc, argv, ClangMoveCategory); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } tooling::CommonOptionsParser &OptionsParser = ExpectedParser.get(); diff --git a/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp b/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp index fbfce07bb751..33b49f20afa8 100644 --- a/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp +++ b/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp @@ -53,7 +53,7 @@ int main(int argc, const char **argv) { auto ExpectedParser = tooling::CommonOptionsParser::create( argc, argv, ClangReorderFieldsCategory, cl::OneOrMore, Usage); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 5a1335c19c55..c0956a29895e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -337,9 +337,9 @@ Changes in existing checks - Improved :doc:`cppcoreguidelines-missing-std-forward ` check: - + - Fixed false positive for constrained template parameters - + - Fixed false positive with ``std::forward`` in brace-init and paren-init lambda captures such as ``[t{std::forward(t)}]``. @@ -513,7 +513,7 @@ Changes in existing checks - Fixed incorrect naming style application to C++17 structured bindings. - - Fixed a false positive where function templates could be diagnosed as generic + - Fixed a false positive where function templates could be diagnosed as generic identifiers when `DefaultCase` was enabled. - Improved :doc:`readability-implicit-bool-conversion @@ -581,6 +581,8 @@ Improvements to include-fixer Improvements to clang-include-fixer ----------------------------------- +- Fixed crashes when command-line argument parsing failed at unknown tool options. + Improvements to modularize -------------------------- diff --git a/clang-tools-extra/test/clang-change-namespace/argument-parsing-error-no-abort.cpp b/clang-tools-extra/test/clang-change-namespace/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..871e18dd2728 --- /dev/null +++ b/clang-tools-extra/test/clang-change-namespace/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-change-namespace --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: clang-change-namespace{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang-tools-extra/test/clang-include-fixer/argument-parsing-error-no-abort.cpp b/clang-tools-extra/test/clang-include-fixer/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..b1b687fe4312 --- /dev/null +++ b/clang-tools-extra/test/clang-include-fixer/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-include-fixer --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: clang-include-fixer{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang-tools-extra/test/clang-include-fixer/find-all-symbols/argument-parsing-error-no-abort.cpp b/clang-tools-extra/test/clang-include-fixer/find-all-symbols/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..6212ad959f08 --- /dev/null +++ b/clang-tools-extra/test/clang-include-fixer/find-all-symbols/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not find-all-symbols --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: find-all-symbols{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang-tools-extra/test/clang-move/argument-parsing-error-no-abort.cpp b/clang-tools-extra/test/clang-move/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..f55e4d17b779 --- /dev/null +++ b/clang-tools-extra/test/clang-move/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-move --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: clang-move{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang-tools-extra/test/clang-reorder-fields/argument-parsing-error-no-abort.cpp b/clang-tools-extra/test/clang-reorder-fields/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..4e0421088036 --- /dev/null +++ b/clang-tools-extra/test/clang-reorder-fields/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-reorder-fields --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: clang-reorder-fields{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang/include/clang/Tooling/CommonOptionsParser.h b/clang/include/clang/Tooling/CommonOptionsParser.h index 5e2cdc6ac458..09310fd9d2d4 100644 --- a/clang/include/clang/Tooling/CommonOptionsParser.h +++ b/clang/include/clang/Tooling/CommonOptionsParser.h @@ -57,7 +57,7 @@ namespace tooling { /// auto ExpectedParser = /// CommonOptionsParser::create(argc, argv, MyToolCategory); /// if (!ExpectedParser) { -/// llvm::errs() << ExpectedParser.takeError(); +/// llvm::errs() << llvm::toString(ExpectedParser.takeError()); /// return 1; /// } /// CommonOptionsParser& OptionsParser = ExpectedParser.get(); diff --git a/clang/test/Refactor/argument-parsing-error-no-abort.cpp b/clang/test/Refactor/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..446793535fcb --- /dev/null +++ b/clang/test/Refactor/argument-parsing-error-no-abort.cpp @@ -0,0 +1,2 @@ +// RUN: not clang-refactor --nonsense 2>&1 | FileCheck %s +// CHECK: clang-refactor{{(\.exe)?}}: Unknown command line argument '--nonsense' diff --git a/clang/test/Tooling/argument-parsing-error-no-abort.cpp b/clang/test/Tooling/argument-parsing-error-no-abort.cpp new file mode 100644 index 000000000000..cb1a00d12aa3 --- /dev/null +++ b/clang/test/Tooling/argument-parsing-error-no-abort.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-check --nonsense %s -- 2>&1 | FileCheck %s +// CHECK: clang-check{{(\.exe)?}}: Unknown command line argument '--nonsense' + +int main() { return 0; } diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index 80255c647b98..7672b59b3548 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -203,7 +203,7 @@ int main(int argc, const char **argv) { auto ExpectedParser = CommonOptionsParser::create(argc, argv, ClangCheckCategory); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } CommonOptionsParser &OptionsParser = ExpectedParser.get(); diff --git a/clang/tools/clang-refactor/ClangRefactor.cpp b/clang/tools/clang-refactor/ClangRefactor.cpp index a92b3f91beae..d011bf30a7c5 100644 --- a/clang/tools/clang-refactor/ClangRefactor.cpp +++ b/clang/tools/clang-refactor/ClangRefactor.cpp @@ -617,7 +617,7 @@ int main(int argc, const char **argv) { argc, argv, cl::getGeneralCategory(), cl::ZeroOrMore, "Clang-based refactoring tool for C, C++ and Objective-C"); if (!ExpectedParser) { - llvm::errs() << ExpectedParser.takeError(); + llvm::errs() << llvm::toString(ExpectedParser.takeError()); return 1; } CommonOptionsParser &Options = ExpectedParser.get();