diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-12-23 04:11:44 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-12-23 04:11:44 +0000 |
commit | 604d939ac15d1398761df313679673d30bb10f27 (patch) | |
tree | efa38d56bb4c83f531592414f2882ec653659b45 | |
parent | e59df87e787d4dc53e6a1af29e89d3ea1839ef0b (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.cpp | 4 | ||||
-rw-r--r-- | test/Analysis/dead-stores.cpp | 26 |
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. //===----------------------------------------------------------------------===// |