naveen-seth wrote:

> Thanks for working on that. I think it might better to do that check where 
> `ParsedSourceLocation::FromString` is called, so that we can have a proper 
> front-end diagnostics for it (search for `err_fe_invalid_code_complete_file` 
> and `OPT_code_completion_at`)

Thank you for the quick review! :)

I added the check in `ParsedSourceLocation::FromString` because it also helps 
catch the same crash for callers of `ParsedSourceRange::FromString`, which also 
uses `ParsedSourceLocation::FromString`.

For example, the following would also crash (hitting the same assert as the one 
this PR fixes)

```bash
touch empty.cpp
clang-refactor local-rename -selection=input.cpp:1:1-1:0 -new-name=test -v 
input.cpp 
```
<details>
<summary> Full crash log</summary>

```
Error while trying to load a compilation database:
Could not auto-detect compilation database for file "input.cpp"
No compilation database found in 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-debug-env/debugging-139375 
or any parent directory
fixed-compilation-database: Error while opening fixed database: No such file or 
directory
json-compilation-database: Error while opening JSON database: No such file or 
directory
Running without flags.
clang-refactor: 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Basic/SourceManager.cpp:1666:
 SourceLocation clang::SourceManager::translateLineCol(FileID, unsigned int, 
unsigned int) const: Assertion `Line && Col && "Line and column should start 
from 1!"' failed.
 #0 0x0000562e7ef658cd llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/llvm/lib/Support/Unix/Signals.inc:804:11
 #1 0x0000562e7ef65e0b PrintStackTraceSignalHandler(void*) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/llvm/lib/Support/Unix/Signals.inc:888:1
 #2 0x0000562e7ef63f2f llvm::sys::RunSignalHandlers() 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/llvm/lib/Support/Signals.cpp:105:5
 #3 0x0000562e7ef664e9 SignalHandler(int, siginfo_t*, void*) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/llvm/lib/Support/Unix/Signals.inc:418:7
 #4 0x00007f6311a5e250 (/lib/x86_64-linux-gnu/libc.so.6+0x45250)
 #5 0x00007f6311abcf1c pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0xa3f1c)
 #6 0x00007f6311a5e19e raise (/lib/x86_64-linux-gnu/libc.so.6+0x4519e)
 #7 0x00007f6311a41902 abort (/lib/x86_64-linux-gnu/libc.so.6+0x28902)
 #8 0x00007f6311a4181e (/lib/x86_64-linux-gnu/libc.so.6+0x2881e)
 #9 0x00007f6311a547c7 (/lib/x86_64-linux-gnu/libc.so.6+0x3b7c7)
#10 0x0000562e7fbee816 clang::SourceManager::translateLineCol(clang::FileID, 
unsigned int, unsigned int) const 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Basic/SourceManager.cpp:1668:11
#11 0x0000562e7ed5dc34 (anonymous 
namespace)::SourceRangeSelectionArgument::forAllRanges(clang::SourceManager 
const&, llvm::function_ref<void (clang::SourceRange)>) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/tools/clang-refactor/ClangRefactor.cpp:131:12
#12 0x0000562e7ed5eb2b (anonymous 
namespace)::ClangRefactorTool::callback(clang::ASTContext&) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/tools/clang-refactor/ClangRefactor.cpp:418:11
#13 0x0000562e7ed5e840 (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)::operator()(clang::ASTContext&)
 const 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/tools/clang-refactor/ClangRefactor.cpp:475:35
#14 0x0000562e7ed5e80d void std::__invoke_impl<void, (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)&,
 clang::ASTContext&>(std::__invoke_other, (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)&,
 clang::ASTContext&) 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:61:7
#15 0x0000562e7ed5e7ad std::enable_if<is_invocable_r_v<void, (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)&,
 clang::ASTContext&>, void>::type std::__invoke_r<void, (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)&,
 clang::ASTContext&>((anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)&,
 clang::ASTContext&) 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/invoke.h:117:5
#16 0x0000562e7ed5e6f5 std::_Function_handler<void (clang::ASTContext&), 
(anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::'lambda'(clang::ASTContext&)>::_M_invoke(std::_Any_data
 const&, clang::ASTContext&) 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:290:2
#17 0x0000562e7ed774c6 std::function<void 
(clang::ASTContext&)>::operator()(clang::ASTContext&) const 
/usr/lib/gcc/x86_64-linux-gnu/14/../../../../include/c++/14/bits/std_function.h:591:2
#18 0x0000562e7ed5f3b1 (anonymous 
namespace)::ClangRefactorTool::getFrontendActionFactory()::ToolASTConsumer::HandleTranslationUnit(clang::ASTContext&)
 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/tools/clang-refactor/ClangRefactor.cpp:441:7
#19 0x0000562e80984ffb clang::ParseAST(clang::Sema&, bool, bool) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Parse/ParseAST.cpp:191:12
#20 0x0000562e800193d9 clang::ASTFrontendAction::ExecuteAction() 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Frontend/FrontendAction.cpp:1345:1
#21 0x0000562e80018e26 clang::FrontendAction::Execute() 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Frontend/FrontendAction.cpp:1229:7
#22 0x0000562e7ff2f0b3 
clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Frontend/CompilerInstance.cpp:1057:23
#23 0x0000562e8044f193 
clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>,
 clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, 
clang::DiagnosticConsumer*) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Tooling/Tooling.cpp:466:14
#24 0x0000562e8044f05b clang::tooling::ToolInvocation::runInvocation(char 
const*, clang::driver::Compilation*, 
std::shared_ptr<clang::CompilerInvocation>, 
std::shared_ptr<clang::PCHContainerOperations>) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Tooling/Tooling.cpp:441:18
#25 0x0000562e8044e217 clang::tooling::ToolInvocation::run() 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Tooling/Tooling.cpp:426:3
#26 0x0000562e80450382 
clang::tooling::ClangTool::run(clang::tooling::ToolAction*) 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/lib/Tooling/Tooling.cpp:624:11
#27 0x0000562e7ed595ea main 
/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/clang/tools/clang-refactor/ClangRefactor.cpp:636:38
#28 0x00007f6311a433b8 (/lib/x86_64-linux-gnu/libc.so.6+0x2a3b8)
#29 0x00007f6311a4347b __libc_start_main 
(/lib/x86_64-linux-gnu/libc.so.6+0x2a47b)
#30 0x0000562e7ed591e5 _start 
(/home/nav/.distrobox/ubuntu-24-10-compiler-dev/llvm-project-dev/build/bin/clang-refactor+0x23741e5)
Aborted (core dumped)
```

</details>

(And similar invalid inputs like `<file>:<line>:-1` are caught in 
`ParsedSourceLocation::FromString`)


I could move the check up to the locations where 
`ParsedSourceLocation::FromString` and `ParsedSourceRange::FromString` are 
called, but I believe it should be possible to provide a proper front-end 
diagnostic without moving the check.
For context, this PR currently changes the behavior of the crash in #139375 to 
also omit the `diag::err_drv_invalid_value` diagnostic, but I could adjust it 
to hint at the right format.

What do you think is best here?

https://github.com/llvm/llvm-project/pull/139457
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to