Skip to content

Commit c70d38e

Browse files
committed
Remove a useless assertion in clang-check.
The assertion prevents it from applying fixes when used along with compilation databases with relative paths. Added a test that demonstrates the assertion failure. An example of the assertion: input.cpp:11:14: error: expected ';' after top level declarator typedef int T ^ ; input.cpp:11:14: note: FIX-IT applied suggested code changes clang-check: clang/tools/clang-check/ClangCheck.cpp:94: virtual std::string (anonymous namespace)::FixItOptions::RewriteFilename(const std::string &, int &): Assertion `llvm::sys::path::is_absolute(filename) && "clang-fixit expects absolute paths only."' failed. #0 llvm::sys::PrintStackTrace(llvm::raw_ostream&) llvm/lib/Support/Unix/Signals.inc:494:13 llvm#1 llvm::sys::RunSignalHandlers() llvm/lib/Support/Signals.cpp:69:18 llvm#2 SignalHandler(int) llvm/lib/Support/Unix/Signals.inc:357:1 llvm#3 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x110c0) llvm#4 raise (/lib/x86_64-linux-gnu/libc.so.6+0x32fcf) llvm#5 abort (/lib/x86_64-linux-gnu/libc.so.6+0x343fa) llvm#6 (/lib/x86_64-linux-gnu/libc.so.6+0x2be37) llvm#7 (/lib/x86_64-linux-gnu/libc.so.6+0x2bee2) llvm#8 void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*, std::forward_iterator_tag) llvm#9 void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct_aux<char*>(char*, char*, std::__false_type) llvm#10 void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<char*>(char*, char*) llvm#11 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) llvm#12 (anonymous namespace)::FixItOptions::RewriteFilename(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&) clang/tools/clang-check/ClangCheck.cpp:101:0 llvm#13 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_data() const llvm#14 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_is_local() const llvm#15 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose() llvm#16 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() llvm#17 clang::FixItRewriter::WriteFixedFiles(std::vector<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >*) clang/lib/Frontend/Rewrite/FixItRewriter.cpp:98:0 llvm#18 std::__shared_ptr<clang::CompilerInvocation, (__gnu_cxx::_Lock_policy)2>::get() const llvm#19 std::__shared_ptr_access<clang::CompilerInvocation, (__gnu_cxx::_Lock_policy)2, false, false>::_M_get() const llvm#20 std::__shared_ptr_access<clang::CompilerInvocation, (__gnu_cxx::_Lock_policy)2, false, false>::operator->() const llvm#21 clang::CompilerInstance::getFrontendOpts() clang/include/clang/Frontend/CompilerInstance.h:290:0 llvm#22 clang::FrontendAction::EndSourceFile() clang/lib/Frontend/FrontendAction.cpp:966:0 llvm#23 __gnu_cxx::__normal_iterator<clang::FrontendInputFile*, std::vector<clang::FrontendInputFile, std::allocator<clang::FrontendInputFile> > >::operator++() llvm#24 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) clang/lib/Frontend/CompilerInstance.cpp:943:0 llvm#25 clang::tooling::FrontendActionFactory::runInvocation(std::shared_ptr<clang::CompilerInvocation>, clang::FileManager*, std::shared_ptr<clang::PCHContainerOperations>, clang::DiagnosticConsumer*) clang/lib/Tooling/Tooling.cpp:369:33 llvm#26 clang::tooling::ToolInvocation::runInvocation(char const*, clang::driver::Compilation*, std::shared_ptr<clang::CompilerInvocation>, std::shared_ptr<clang::PCHContainerOperations>) clang/lib/Tooling/Tooling.cpp:344:18 llvm#27 clang::tooling::ToolInvocation::run() clang/lib/Tooling/Tooling.cpp:329:10 llvm#28 clang::tooling::ClangTool::run(clang::tooling::ToolAction*) clang/lib/Tooling/Tooling.cpp:518:11 llvm#29 main clang/tools/clang-check/ClangCheck.cpp:187:15 llvm-svn: 357915
1 parent 86844a8 commit c70d38e

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// RUN: rm -rf %t
2+
// RUN: mkdir %t
3+
//
4+
// RUN: sed -s 's,^//.*,//,' %s > %t/absolute-fixed.cpp
5+
// RUN: sed -s 's,^//.*,//,' %s > %t/absolute-json.cpp
6+
// RUN: sed -s 's,^//.*,//,' %s > %t/relative-fixed.cpp
7+
// RUN: sed -s 's,^//.*,//,' %s > %t/relative-json.cpp
8+
//
9+
// RUN: clang-check %t/absolute-fixed.cpp -fixit -- 2>&1 | FileCheck %s
10+
//
11+
// RUN: echo '[{ "directory": "%t", \
12+
// RUN: "command": "/path/to/clang -c %t/absolute-json.cpp", \
13+
// RUN: "file": "%t/absolute-json.cpp" }]' > %t/compile_commands.json
14+
// RUN: clang-check %t/absolute-json.cpp -fixit 2>&1 | FileCheck %s
15+
//
16+
// RUN: cd %t
17+
// RUN: clang-check relative-fixed.cpp -fixit -- 2>&1 | FileCheck %s
18+
//
19+
// RUN: echo '[{ "directory": "%t", \
20+
// RUN: "command": "/path/to/clang -c relative-json.cpp", \
21+
// RUN: "file": "relative-json.cpp" }]' > %t/compile_commands.json
22+
// RUN: clang-check relative-json.cpp -fixit 2>&1 | FileCheck %s
23+
typedef int T
24+
// CHECK: .cpp:[[@LINE-1]]:14: error: expected ';' after top level declarator
25+
// CHECK: .cpp:[[@LINE-2]]:14: note: FIX-IT applied suggested code changes

clang/tools/clang-check/ClangCheck.cpp

-3
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,6 @@ class FixItOptions : public clang::FixItOptions {
9090
}
9191

9292
std::string RewriteFilename(const std::string& filename, int &fd) override {
93-
assert(llvm::sys::path::is_absolute(filename) &&
94-
"clang-fixit expects absolute paths only.");
95-
9693
// We don't need to do permission checking here since clang will diagnose
9794
// any I/O errors itself.
9895

0 commit comments

Comments
 (0)