summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp5
-rw-r--r--clang/test/Analysis/use-after-move.cpp10
2 files changed, 14 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
index d9ea0d967cd..c93ba9d3b4e 100644
--- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp
@@ -343,8 +343,11 @@ bool MoveChecker::isStateResetMethod(const CXXMethodDecl *MethodDec) const {
return true;
if (MethodDec->getDeclName().isIdentifier()) {
std::string MethodName = MethodDec->getName().lower();
+ // TODO: Some of these methods (eg., resize) are not always resetting
+ // the state, so we should consider looking at the arguments.
if (MethodName == "reset" || MethodName == "clear" ||
- MethodName == "destroy")
+ MethodName == "destroy" || MethodName == "resize" ||
+ MethodName == "shrink")
return true;
}
return false;
diff --git a/clang/test/Analysis/use-after-move.cpp b/clang/test/Analysis/use-after-move.cpp
index 0e7f5d5ce13..3134720e4df 100644
--- a/clang/test/Analysis/use-after-move.cpp
+++ b/clang/test/Analysis/use-after-move.cpp
@@ -15,6 +15,8 @@
namespace std {
+typedef __typeof(sizeof(int)) size_t;
+
template <typename>
struct remove_reference;
@@ -110,6 +112,7 @@ public:
void reset();
void destroy();
void clear();
+ void resize(std::size_t);
bool empty() const;
bool isEmpty() const;
operator bool() const;
@@ -403,6 +406,13 @@ void moveStateResetFunctionsTest() {
a.foo(); // no-warning
a.b.foo(); // no-warning
}
+ {
+ A a;
+ A b = std::move(a);
+ a.resize(0); // no-warning
+ a.foo(); // no-warning
+ a.b.foo(); // no-warning
+ }
}
// Moves or uses that occur as part of template arguments.
OpenPOWER on IntegriCloud