From 052436f76868808789b403a246a60859d5c9c60f Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Mon, 27 Nov 2017 17:37:09 +0000 Subject: [PATCH] [analyzer] pr34766: Fix a crash on explicit std::initializer_list constructor. We didn't support the following syntax: (std::initializer_list){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 --- clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp | 2 +- clang/test/Analysis/initializer.cpp | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp index d6feabe..e0e1c36 100644 --- a/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp +++ b/clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp @@ -535,7 +535,7 @@ void ExprEngine::VisitCompoundLiteralExpr(const CompoundLiteralExpr *CL, const Expr *Init = CL->getInitializer(); SVal V = State->getSVal(CL->getInitializer(), LCtx); - if (isa(Init)) { + if (isa(Init) || isa(Init)) { // No work needed. Just pass the value up to this expression. } else { assert(isa(Init)); diff --git a/clang/test/Analysis/initializer.cpp b/clang/test/Analysis/initializer.cpp index e9658a0..6359b93 100644 --- a/clang/test/Analysis/initializer.cpp +++ b/clang/test/Analysis/initializer.cpp @@ -211,7 +211,7 @@ namespace CXX_initializer_lists { struct C { C(std::initializer_list 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){12}; // no-crash +} } -- 2.7.4