r277522 - [CFG] Fix crash finding destructor of lifetime-extended temporary.
Hans Wennborg via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 9 11:57:44 PDT 2016
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
More information about the cfe-commits
mailing list