diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-06-27 22:54:33 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2013-06-27 22:54:33 +0000 |
commit | 8d7f11da50d0c729887befce0f6c7c1b5cff792e (patch) | |
tree | b6ec5685f429b35ca345517861d965eb49766c37 /clang/lib/Sema/SemaInit.cpp | |
parent | 5c5e6179a06b5283d3952c16f0deab8a010f23aa (diff) | |
download | bcm5719-llvm-8d7f11da50d0c729887befce0f6c7c1b5cff792e.tar.gz bcm5719-llvm-8d7f11da50d0c729887befce0f6c7c1b5cff792e.zip |
Fix nested lifetime extension when a std::initializer_list member is
initialized during aggregate initialization of the surrounding structure.
llvm-svn: 185117
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 9370287bee9..f59571a4865 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -5348,13 +5348,15 @@ static void performLifetimeExtension(Expr *Init, const ValueDecl *ExtendingD) { I != E; ++I) { if (I->isUnnamedBitfield()) continue; + Expr *SubInit = ILE->getInit(Index); if (I->getType()->isReferenceType()) - performReferenceExtension(ILE->getInit(Index), ExtendingD); - else if (isa<InitListExpr>(ILE->getInit(Index))) + performReferenceExtension(SubInit, ExtendingD); + else if (isa<InitListExpr>(SubInit) || + isa<CXXStdInitializerListExpr>(SubInit)) // This may be either aggregate-initialization of a member or // initialization of a std::initializer_list object. Either way, // we should recursively lifetime-extend that initializer. - performLifetimeExtension(ILE->getInit(Index), ExtendingD); + performLifetimeExtension(SubInit, ExtendingD); ++Index; } } |