Sourabh Singh Tomar via llvm-dev
2019-Oct-07 22:26 UTC
[llvm-dev] Fwd: Triviality of C++11 Copy/Move Constructor, Destructor in clang AST.
Forgot to seek your comments on this one. Some of my test cases are failing due to this. Thanks! --Sourabh ---------- Forwarded message --------- From: Sourabh Singh Tomar <sourav0311 at gmail.com> Date: Fri, Sep 20, 2019 at 5:33 PM Subject: Triviality of C++11 Copy/Move Constructor, Destructor in clang AST. To: <cfe-dev at lists.llvm.org>, <jinisusan.george at amd.com>, < sourabhsingh.tomar at amd.com> Hi All, We're working DWARF-5 support in clang, c++11 Defaulted, deleted member functions. We're facing an issue while parsing attributes of a destructor which is defined out of class. as default. as in class foo { public; foo(); ~foo(); }; foo::foo() = default; foo::~foo() = default; Here's the code snippet of clang changes-- if (const auto *DXXC = dyn_cast<CXXDestructorDecl>(Method)) { 1624 if (DXXC->getCanonicalDecl()->isDeleted()) 1625 SPFlags |= llvm::DISubprogram::SPFlagDeleted; 1626 1627 if (DXXC->getCanonicalDecl()->isDefaulted()) 1628 SPFlags |= llvm::DISubprogram::SPFlagDefaultedInClass; 1629 else if (DXXC->isDefined()) { 1630 if (DXXC->getDefinition()->isDefaulted()) { 1631 SPFlags |= llvm::DISubprogram::SPFlagDefaultedOutOfClass; 1632 } 1633 else { 1634 SPFlags |= llvm::DISubprogram::SPFlagNotDefaulted; 1635 } 1636 } 1637 } For, out of class destructor definition defaulted, as mentioned above. We're not able get SPFlagDefaultedOutOfClass or SPFlagNotDefaulted. seems like their is no definition of destructor, even when, we are defining them out of class as default; ?? 1629 else if (DXXC->isDefined()) -- evaluates as false On the other side, If we declare our destructor as virtual, then above checks passes gracefully -- suggesting clang created a non-trivial destructor definition. Is this behavior okay ?? , -- this behavior is also prevalent in copy/move constructor and assignments. Note-- For Constructor out of class definition as default -- clang create non-trivial constructor definition, and above check passes and we're are able to check capture the information about, whether the constructor is defaulted in class or out of class. Any thoughts, greatly appreciated. Thanks! Sourabh Singh Tomar -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191008/eed0e231/attachment.html>
David Blaikie via llvm-dev
2019-Oct-07 22:35 UTC
[llvm-dev] Fwd: Triviality of C++11 Copy/Move Constructor, Destructor in clang AST.
I saw it was already under review & didn't see any particular spots that referred to the problems you mentioned in this thread - if there are bugs in the code as it is in the review, it'd be good to highlight those in the review description and probably in the test cases (FIXME and/or CHECKs that currently fail to demonstrate what the behavior should be, etc) On Mon, Oct 7, 2019 at 3:26 PM Sourabh Singh Tomar via llvm-dev < llvm-dev at lists.llvm.org> wrote:> > Forgot to seek your comments on this one. > Some of my test cases are failing due to this. > > Thanks! > --Sourabh > ---------- Forwarded message --------- > From: Sourabh Singh Tomar <sourav0311 at gmail.com> > Date: Fri, Sep 20, 2019 at 5:33 PM > Subject: Triviality of C++11 Copy/Move Constructor, Destructor in clang > AST. > To: <cfe-dev at lists.llvm.org>, <jinisusan.george at amd.com>, < > sourabhsingh.tomar at amd.com> > > > Hi All, > > We're working DWARF-5 support in clang, c++11 Defaulted, deleted member > functions. > We're facing an issue while parsing attributes of a destructor which is > defined out of class. as default. > as in > class foo { > public; > foo(); > ~foo(); > }; > foo::foo() = default; > foo::~foo() = default; > > Here's the code snippet of clang changes-- > > if (const auto *DXXC = dyn_cast<CXXDestructorDecl>(Method)) { > 1624 if (DXXC->getCanonicalDecl()->isDeleted()) > 1625 SPFlags |= llvm::DISubprogram::SPFlagDeleted; > 1626 > 1627 if (DXXC->getCanonicalDecl()->isDefaulted()) > 1628 SPFlags |= llvm::DISubprogram::SPFlagDefaultedInClass; > 1629 else if (DXXC->isDefined()) { > 1630 if (DXXC->getDefinition()->isDefaulted()) { > 1631 SPFlags |= llvm::DISubprogram::SPFlagDefaultedOutOfClass; > 1632 } > 1633 else { > 1634 SPFlags |= llvm::DISubprogram::SPFlagNotDefaulted; > 1635 } > 1636 } > 1637 } > > For, out of class destructor definition defaulted, as mentioned above. > We're not able get SPFlagDefaultedOutOfClass or SPFlagNotDefaulted. > > seems like their is no definition of destructor, even when, we are > defining them out of class as default; ?? > 1629 else if (DXXC->isDefined()) -- evaluates as false > > On the other side, If we declare our destructor as virtual, then above > checks passes gracefully -- suggesting clang created a non-trivial > destructor definition. > > Is this behavior okay ?? , -- this behavior is also prevalent in > copy/move constructor and assignments. > > Note-- For Constructor out of class definition as default -- clang create > non-trivial constructor definition, and above check passes and we're are > able to check capture the information about, whether the constructor is > defaulted in class or out of class. > > Any thoughts, greatly appreciated. > > Thanks! > Sourabh Singh Tomar > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191007/e3404143/attachment.html>