]> granicus.if.org Git - clang/commitdiff
[analyzer] pr34766: Fix a crash on explicit std::initializer_list constructor.
authorArtem Dergachev <artem.dergachev@gmail.com>
Mon, 27 Nov 2017 17:37:09 +0000 (17:37 +0000)
committerArtem Dergachev <artem.dergachev@gmail.com>
Mon, 27 Nov 2017 17:37:09 +0000 (17:37 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@319058 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/ExprEngineC.cpp
test/Analysis/initializer.cpp

index d6feabea534baec569e3628639000f7e67069393..e0e1c3617deea1b5618bd5392f8be1594994b860 100644 (file)
@@ -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));
index e9658a067c2fb2ed3b3b677b5f114dd67f3211a0..6359b93d0a299b255a2c15da34441cbb17f981ce 100644 (file)
@@ -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
+}
 }