From 8f6134c308951a72642eebb65a44408ea1e237a8 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Wed, 10 Jul 2013 19:14:10 +0000 Subject: [PATCH] [analyzer] Remove bogus assert: in C++11, 'new' can do list-initialization. Previously, we asserted that whenever 'new' did not include a constructor call, the type must be a non-record type. In C++11, however, uniform initialization syntax (braces) allow 'new' to construct records with list-initialization: "new Point{1, 2}". Removing this assertion should be perfectly safe; the code here matches what VisitDeclStmt does for regions allocated on the stack. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@186028 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/StaticAnalyzer/Core/ExprEngineCXX.cpp | 2 -- test/Analysis/new.cpp | 10 ++++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp index 3f16c62492..1342e4149f 100644 --- a/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp +++ b/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp @@ -431,8 +431,6 @@ void ExprEngine::VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred, if (!isa(Init)) { assert(Bldr.getResults().size() == 1); Bldr.takeNodes(NewN); - - assert(!CNE->getType()->getPointeeCXXRecordDecl()); evalBind(Dst, CNE, NewN, Result, State->getSVal(Init, LCtx), /*FirstInit=*/IsStandardGlobalOpNewFunction); } diff --git a/test/Analysis/new.cpp b/test/Analysis/new.cpp index 8d3eee9baa..27cbb0816b 100644 --- a/test/Analysis/new.cpp +++ b/test/Analysis/new.cpp @@ -170,6 +170,16 @@ void testUsingThisAfterDelete() { c->f(0); // no-warning } +void testAggregateNew() { + struct Point { int x, y; }; + new Point{1, 2}; // no crash + + Point p; + new (&p) Point{1, 2}; // no crash + clang_analyzer_eval(p.x == 1); // expected-warning{{TRUE}} + clang_analyzer_eval(p.y == 2); // expected-warning{{TRUE}} +} + //-------------------------------- // Incorrectly-modelled behavior //-------------------------------- -- 2.50.1