r277522 - [CFG] Fix crash finding destructor of lifetime-extended temporary.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 11 11:13:10 PDT 2016


Well, the whole approach here is still wrong (per the FIXME in
CFGBuilder::addLocalScopeForVarDecl) but this at least makes it consistent.
Let's take this for 3.9 to at least stem the bleeding.

On Tue, Aug 9, 2016 at 11:57 AM, Hans Wennborg <hans at chromium.org> wrote:

> For the record, this was for PR28666.
>
> Richard: what do you think about merging this to 3.9?
>
> On Tue, Aug 2, 2016 at 2:07 PM, Devin Coughlin via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
> > Author: dcoughlin
> > Date: Tue Aug  2 16:07:23 2016
> > New Revision: 277522
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=277522&view=rev
> > Log:
> > [CFG] Fix crash finding destructor of lifetime-extended temporary.
> >
> > Fix a crash under -Wthread-safety when finding the destructor for a
> > lifetime-extending reference.
> >
> > A patch by Nandor Licker!
> >
> > Differential Revision: https://reviews.llvm.org/D22419
> >
> > Modified:
> >     cfe/trunk/lib/Analysis/CFG.cpp
> >     cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp
> >
> > Modified: cfe/trunk/lib/Analysis/CFG.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> Analysis/CFG.cpp?rev=277522&r1=277521&r2=277522&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/lib/Analysis/CFG.cpp (original)
> > +++ cfe/trunk/lib/Analysis/CFG.cpp Tue Aug  2 16:07:23 2016
> > @@ -3902,7 +3902,17 @@ CFGImplicitDtor::getDestructorDecl(ASTCo
> >      case CFGElement::AutomaticObjectDtor: {
> >        const VarDecl *var = castAs<CFGAutomaticObjDtor>().getVarDecl();
> >        QualType ty = var->getType();
> > -      ty = ty.getNonReferenceType();
> > +
> > +      // FIXME: See CFGBuilder::addLocalScopeForVarDecl.
> > +      //
> > +      // Lifetime-extending constructs are handled here. This works for
> a single
> > +      // temporary in an initializer expression.
> > +      if (ty->isReferenceType()) {
> > +        if (const Expr *Init = var->getInit()) {
> > +          ty = getReferenceInitTemporaryType(astContext, Init);
> > +        }
> > +      }
> > +
> >        while (const ArrayType *arrayType =
> astContext.getAsArrayType(ty)) {
> >          ty = arrayType->getElementType();
> >        }
> >
> > Modified: cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp
> > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/warn-thread-safety-analysis.cpp?rev=277522&r1=
> 277521&r2=277522&view=diff
> > ============================================================
> ==================
> > --- cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp (original)
> > +++ cfe/trunk/test/SemaCXX/warn-thread-safety-analysis.cpp Tue Aug  2
> 16:07:23 2016
> > @@ -5160,6 +5160,21 @@ void test3() {
> >  }  // end namespace  GlobalAcquiredBeforeAfterTest
> >
> >
> > +namespace LifetimeExtensionText {
> > +
> > +struct Holder {
> > +  virtual ~Holder() throw() {}
> > +  int i = 0;
> > +};
> > +
> > +void test() {
> > +  // Should not crash.
> > +  const auto &value = Holder().i;
> > +}
> > +
> > +} // end namespace LifetimeExtensionTest
> > +
> > +
> >  namespace LockableUnions {
> >
> >  union LOCKABLE MutexUnion {
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160811/6f267d6c/attachment.html>


More information about the cfe-commits mailing list