aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-12-23 04:11:44 +0000
committerTed Kremenek <kremenek@apple.com>2009-12-23 04:11:44 +0000
commit604d939ac15d1398761df313679673d30bb10f27 (patch)
treeefa38d56bb4c83f531592414f2882ec653659b45
parente59df87e787d4dc53e6a1af29e89d3ea1839ef0b (diff)
Suppress dead store warnings involving objects initialized with CXXExprTemporaries.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91986 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/CheckDeadStores.cpp4
-rw-r--r--test/Analysis/dead-stores.cpp26
2 files changed, 30 insertions, 0 deletions
diff --git a/lib/Analysis/CheckDeadStores.cpp b/lib/Analysis/CheckDeadStores.cpp
index f081c69c2b..6e4d899862 100644
--- a/lib/Analysis/CheckDeadStores.cpp
+++ b/lib/Analysis/CheckDeadStores.cpp
@@ -201,6 +201,10 @@ public:
// constructors/destructors don't have side effects.
if (isa<CXXConstructExpr>(E))
return;
+
+ if (isa<CXXExprWithTemporaries>(E))
+ return;
+
// A dead initialization is a variable that is dead after it
// is initialized. We don't flag warnings for those variables
// marked 'unused'.
diff --git a/test/Analysis/dead-stores.cpp b/test/Analysis/dead-stores.cpp
index 45f750688f..9778a11c92 100644
--- a/test/Analysis/dead-stores.cpp
+++ b/test/Analysis/dead-stores.cpp
@@ -39,6 +39,32 @@ int test2(int x) {
}
//===----------------------------------------------------------------------===//
+// Dead store checking involving CXXTemporaryExprs
+//===----------------------------------------------------------------------===//
+
+namespace TestTemp {
+ template<typename _Tp>
+ class pencil {
+ public:
+ ~pencil() throw() {}
+ };
+ template<typename _Tp, typename _Number2> struct _Row_base {
+ _Row_base(const pencil<_Tp>& x) {}
+ };
+ template<typename _Tp, typename _Number2 = TestTemp::pencil<_Tp> >
+ class row : protected _Row_base<_Tp, _Number2> {
+ typedef _Row_base<_Tp, _Number2> _Base;
+ typedef _Number2 pencil_type;
+ public:
+ explicit row(const pencil_type& __a = pencil_type()) : _Base(__a) {}
+ };
+}
+
+void test2_b() {
+ TestTemp::row<const char*> x; // no-warning
+}
+
+//===----------------------------------------------------------------------===//
// Test references.
//===----------------------------------------------------------------------===//