[cfe-dev] Using the Sema Object to Generate Implicit Definitions

Gregory Malecha via cfe-dev cfe-dev at lists.llvm.org
Thu Oct 15 14:23:08 PDT 2020

Hello --

I've been trying to use the Sema object to generate implicit definitions,
e.g. default constructors, destructors, etc, in a tool that I have but I'm
running into some issues. The code that I have is a DeclVisitor with the
following for the CXXRecord case.

void VisitCXXRecordDecl(CXXRecordDecl *decl, bool is_specialization) {
  if (not(decl->isImplicit() or decl->isAnonymousStructOrUnion())) {
  // ...

This works great, and always works to get me constructor definitions with
empty bodies but marked as default.

To generate the bodies, I have (roughly) the following code for
constructors, destructors, and methods:

if (not decl->getBody() && decl->isDefaulted()) {
  if (decl->isMoveAssignmentOperator()) {
    ci_->getSema().DefineImplicitMoveAssignment(decl->getLocation(), decl);
  } else if (decl->isCopyAssignmentOperator()) {
    ci_->getSema().DefineImplicitCopyAssignment(decl->getLocation(), decl);

In most cases, this seems to do the trick, but when the implementation of
the operator uses something like memcpy I get a segfault (stack trace
below) due (it seems) to the fact that TUScope is null when my code runs.

#0  0x00007ffff5ff733a in
clang::Sema::PushOnScopeChains(clang::NamedDecl*, clang::Scope*, bool)
() from /usr/lib/libclang-cpp.so.10#1  0x00007ffff601dc18 in
clang::Sema::LazilyCreateBuiltin(clang::IdentifierInfo*, unsigned int,
clang::Scope*, bool, clang::SourceLocation) () from
/usr/lib/libclang-cpp.so.10#2  0x00007ffff63599ac in
clang::Sema::LookupBuiltin(clang::LookupResult&) () from
/usr/lib/libclang-cpp.so.10#3  0x00007ffff636e713 in
clang::Sema::LookupName(clang::LookupResult&, clang::Scope*, bool) ()
from /usr/lib/libclang-cpp.so.10#4  0x00007ffff61512e4 in ?? () from
/usr/lib/libclang-cpp.so.10#5  0x00007ffff6151643 in ?? () from
/usr/lib/libclang-cpp.so.10#6  0x00007ffff6159481 in
clang::CXXMethodDecl*) () from /usr/lib/libclang-cpp.so.10

I can avoid this problem if I put the preprocessor in "incremental
processing mode" using `enableIncrementalProcessing()` from
BeginSourceFileAction in my ASTFrontendAction, but doing this causes clang
to not generate the bodies of template specializations. I assume that this
is because you can't generate specializations until you have the complete
module which makes sense.

Is there some way that I can get both of these, i.e. generate all implicit
declarations *with their bodies* and get template specializations? Perhaps
by using Sema to generate the bodies and then somehow finishing the file to
get clang to generate the specializations? Or maybe I can manually call
something in Sema to generate the bodies of the templates?

Thanks in advance.

gregory malecha
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20201015/9fc2eaa7/attachment.html>

More information about the cfe-dev mailing list