[cfe-dev] ast_matchers::MatchFinder default constructor segfaults away
Whisperity via cfe-dev
cfe-dev at lists.llvm.org
Thu Jul 26 12:31:47 PDT 2018
Dear List,
When trying to instantiate a MatchFinder on my function's local stack,
if I try to use the default constructor, it segfaults.
Relevant code snippet:
void f()
{
MatchFinder finder; // <- SIGSEGV
// ...
}
and backtrace:
(gdb) bt 5
#0 0x00007fffeb240f67 in
llvm::optional_detail::OptionalStorage<clang::ast_matchers::MatchFinder::MatchFinderOptions::Profiling,
true>::OptionalStorage(llvm::optiona
l_detail::OptionalStorage<clang::ast_matchers::MatchFinder::MatchFinderOptions::Profiling,
true>&&) (this=0x7fffdeac3120,
O=<unknown type in
/large/whisperity/llvm/build/./lib/../lib/libclangASTMatchers.so.7, CU
0x0, DIE 0x20cb21>) at ../../../../../include/llvm/ADT/Optional.h:46
#1 0x00007fffeb237f4d in
llvm::Optional<clang::ast_matchers::MatchFinder::MatchFinderOptions::Profiling>::Optional(llvm::Optional<clang::ast_matchers::MatchFinder::M
atchFinderOptions::Profiling>&&) (this=0x7fffdeac3120, O=<unknown type
in /large/whisperity/llvm/build/./lib/../lib/libclangASTMatchers.so.7,
CU 0x0, DIE 0x2002ac>)
at ../../../../../include/llvm/ADT/Optional.h:144
#2 0x00007fffeb237f73 in
clang::ast_matchers::MatchFinder::MatchFinderOptions::MatchFinderOptions(clang::ast_matchers::MatchFinder::MatchFinderOptions&&)
(
this=0x7fffdeac3120) at
../../../../../../clang/include/clang/ASTMatchers/ASTMatchFinder.h:123
#3 0x00007fffeb17fd94 in
clang::ast_matchers::MatchFinder::MatchFinder (this=0x7fffdeac2fe8,
Options=...)
at ../../../../../../clang/lib/ASTMatchers/ASTMatchFinder.cpp:934
The default constructor's init-list moves from the argument and the
method itself is declared in the header with default argument using a
default constructed instance of Options.
The only use place I could find for this class so far is Clang-Tidy.
I don't want to use the options in any special way in my code, that's
why I tried the default initialiser.
If I explicitly initialise a MatchFinder::MatchFinderOptions and pass
it as an argument, either by copy or move, it works.
Passing a temporary by copy or move results in the same segfault.
void f()
{
MatchFinder::MatchFinderOptions opts;
MatchFinder finder(opts); // works
}
I'm not entirely sure what would be the best option to solve this API
inconsistency, as seemingly the error lies two or three types
deeper...
; Whisperity
More information about the cfe-dev
mailing list