summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2013-07-10 19:14:10 +0000
committerJordan Rose <jordan_rose@apple.com>2013-07-10 19:14:10 +0000
commit6444653a06c0bbbaf0cbe6db7195942c3c5d3bff (patch)
tree1a68c4738cb2c4dcc2c2f041a63214b45e15a4fe
parent755d324cd2d8ac9cce5d758a8be5f72388d149a1 (diff)
downloadbcm5719-llvm-6444653a06c0bbbaf0cbe6db7195942c3c5d3bff.tar.gz
bcm5719-llvm-6444653a06c0bbbaf0cbe6db7195942c3c5d3bff.zip
[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. <rdar://problem/14403437> llvm-svn: 186028
-rw-r--r--clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp2
-rw-r--r--clang/test/Analysis/new.cpp10
2 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
index 3f16c624922..1342e4149f6 100644
--- a/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
+++ b/clang/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
@@ -431,8 +431,6 @@ void ExprEngine::VisitCXXNewExpr(const CXXNewExpr *CNE, ExplodedNode *Pred,
if (!isa<CXXConstructExpr>(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/clang/test/Analysis/new.cpp b/clang/test/Analysis/new.cpp
index 8d3eee9baa6..27cbb0816b2 100644
--- a/clang/test/Analysis/new.cpp
+++ b/clang/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
//--------------------------------
OpenPOWER on IntegriCloud