forked from OSchip/llvm-project
[analyzer] pr34766: Fix a crash on explicit std::initializer_list constructor.
We didn't support the following syntax: (std::initializer_list<int>){12} which suddenly produces CompoundLiteralExpr that contains CXXStdInitializerListExpr. Lift the assertion and instead pass the value through CompoundLiteralExpr transparently, as it doesn't add much. Differential Revision: https://reviews.llvm.org/D39803 llvm-svn: 319058
This commit is contained in:
parent
85db2bf7b6
commit
052436f768
|
@ -535,7 +535,7 @@ void ExprEngine::VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL,
|
|||
const Expr *Init = CL->getInitializer();
|
||||
SVal V = State->getSVal(CL->getInitializer(), LCtx);
|
||||
|
||||
if (isa<CXXConstructExpr>(Init)) {
|
||||
if (isa<CXXConstructExpr>(Init) || isa<CXXStdInitializerListExpr>(Init)) {
|
||||
// No work needed. Just pass the value up to this expression.
|
||||
} else {
|
||||
assert(isa<InitListExpr>(Init));
|
||||
|
|
|
@ -211,7 +211,7 @@ namespace CXX_initializer_lists {
|
|||
struct C {
|
||||
C(std::initializer_list<int *> list);
|
||||
};
|
||||
void foo() {
|
||||
void testPointerEscapeIntoLists() {
|
||||
C empty{}; // no-crash
|
||||
|
||||
// Do not warn that 'x' leaks. It might have been deleted by
|
||||
|
@ -219,4 +219,8 @@ void foo() {
|
|||
int *x = new int;
|
||||
C c{x}; // no-warning
|
||||
}
|
||||
|
||||
void testPassListsWithExplicitConstructors() {
|
||||
(void)(std::initializer_list<int>){12}; // no-crash
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue