[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