<div dir="ltr"><div dir="ltr">On Thu, 15 Oct 2020 at 14:23, Gregory Malecha via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello --<div><br></div><div>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.</div><div><br></div>void VisitCXXRecordDecl(CXXRecordDecl *decl, bool is_specialization) {<br>  if (not(decl->isImplicit() or decl->isAnonymousStructOrUnion())) {<br>    ci_->getSema().ForceDeclarationOfImplicitMembers(decl);<br>  } <div>  // ...<br>}<div><br></div><div>This works great, and always works to get me constructor definitions with empty bodies but marked as default.</div><div><br></div><div>To generate the bodies, I have (roughly) the following code for constructors, destructors, and methods:</div><div><br></div>if (not decl->getBody() && decl->isDefaulted()) {<br>  if (decl->isMoveAssignmentOperator()) {<br>    ci_->getSema().DefineImplicitMoveAssignment(decl->getLocation(), decl);<br>  } else if (decl->isCopyAssignmentOperator()) {<br>    ci_->getSema().DefineImplicitCopyAssignment(decl->getLocation(), decl);<br>  }<br>}<br><div><br></div><div>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.</div><div><pre lang="plaintext"><span id="gmail-m_-414611960568319544gmail-LC1" lang="plaintext">#0  0x00007ffff5ff733a in clang::Sema::PushOnScopeChains(clang::NamedDecl*, clang::Scope*, bool) () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC2" lang="plaintext">#1  0x00007ffff601dc18 in clang::Sema::LazilyCreateBuiltin(clang::IdentifierInfo*, unsigned int, clang::Scope*, bool, clang::SourceLocation) () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC3" lang="plaintext">#2  0x00007ffff63599ac in clang::Sema::LookupBuiltin(clang::LookupResult&) () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC4" lang="plaintext">#3  0x00007ffff636e713 in clang::Sema::LookupName(clang::LookupResult&, clang::Scope*, bool) () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC5" lang="plaintext">#4  0x00007ffff61512e4 in ?? () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC6" lang="plaintext">#5  0x00007ffff6151643 in ?? () from /usr/lib/libclang-cpp.so.10</span>
<span id="gmail-m_-414611960568319544gmail-LC7" lang="plaintext">#6  0x00007ffff6159481 in clang::Sema::DefineImplicitCopyAssignment(clang::SourceLocation, clang::CXXMethodDecl*) () from /usr/lib/libclang-cpp.so.10</span>
</pre></div><div>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.</div><div><br></div><div>Is there some way that I can get both of these, i.e. generate all implicit declarations <i>with their bodies</i> 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?</div></div></div></blockquote><div><br></div><div>You can call Sema::ActOnEndOfTranslationUnit() to get it to perform the pending actions that it's been saving up, such as template instantiations.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div><div>Thanks in advance.<br clear="all"><div><br></div>-- <br><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div>gregory malecha</div><div><a href="https://gmalecha.github.io" target="_blank">gmalecha.github.io</a></div></div></div></div></div></div></div></div>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>