summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2013-06-27 22:54:33 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2013-06-27 22:54:33 +0000
commit8d7f11da50d0c729887befce0f6c7c1b5cff792e (patch)
treeb6ec5685f429b35ca345517861d965eb49766c37 /clang/lib/Sema/SemaInit.cpp
parent5c5e6179a06b5283d3952c16f0deab8a010f23aa (diff)
downloadbcm5719-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.cpp8
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;
}
}
OpenPOWER on IntegriCloud