[cfe-dev] Replacing constructor calls in a clang plugin; constructor not emitted

Reid Kleckner via cfe-dev cfe-dev at lists.llvm.org
Tue Jan 17 09:13:36 PST 2017


You need to mark the 2 argument constructor as ODR-used. I think you want
to all Sema.MarkFunctionReferenced.

On Tue, Jan 17, 2017 at 5:57 AM, Jakub Kuderski via cfe-dev <
cfe-dev at lists.llvm.org> wrote:

> Hi,
>
> I'm working on a clang plugin that would replace some constructor calls
> with calls to other constructors.
>
> Here's a simplified example:
>
> template <typename> struct C {
>>   C() {}
>>   C(int, int) {}
>> };
>> C<void> c = {};
>> //C<void> d = {0, 0};
>> int main() {}
>
>
> I want to call the 2-argument constructor to initialize c to make it act
> like the initialization of the d variable below.
>
> I wrote a plugin that runs before the main AST action and does the
> transformation in HandleTopLevelDecl. The problem is that the 2-argument
> constructor is not begin emitted and linking fails.
>
> I'm doing the transformation this way:
>
>> void ChangeCtor(VarDecl *VD) {
>>   VD->dump();
>>   auto &Sema = Instance.getSema();
>>   auto &Context = Sema.getASTContext();
>>   auto Loc = VD->getSourceRange().getBegin();
>>   auto VarQT = VD->getType();
>>   auto *Zero = clang::IntegerLiteral::Create(Context, llvm::APInt(32, 0),
>>                                              Context.IntTy, Loc);
>>   auto *RDecl = VarQT->getAsCXXRecordDecl();
>>   CXXConstructorDecl *Ctor = nullptr;
>>   for (auto *CD : RDecl->ctors())
>>     if (CD->getNumParams() == 2)
>>       Ctor = CD;
>
>
>>   Expr *Params[] = {Zero, Zero};
>>   auto *ConstructExpr = CXXConstructExpr::Create(
>>       Context, VarQT, Loc, Ctor, false, Params, true, true, false, false,
>>       CXXConstructExpr::CK_Complete, VD->getSourceRange());
>>
>
> ConstructExpr->dump();
>>   VD->setInit(ConstructExpr);
>>   VD->dump();
>> }
>
>
> (Here's a gist with all the code:  https://gist.github.com/kuhar/
> fd205c2f38e1baa4331e70dd5cb45b42)
>
> When I uncomment the d variable, or insert a call to the 2-argument ctor
> somewhere else, it gets emitted and links fine - no surprise here.
>
> What am I doing wrong? Any suggestion on how to make it work?
>
> Thanks,
> ~Kuba
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170117/2e5bd62a/attachment.html>


More information about the cfe-dev mailing list