diff options
| -rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp | 9 | ||||
| -rw-r--r-- | clang/test/Analysis/MisusedMovedObject.cpp | 8 |
2 files changed, 16 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp index 70da66dba47..4b69a1bd1ed 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MisusedMovedObjectChecker.cpp @@ -416,7 +416,14 @@ void MisusedMovedObjectChecker::checkPreCall(const CallEvent &Call, return; if (isStateResetMethod(MethodDecl)) { - State = State->remove<TrackedRegionMap>(ThisRegion); + // A state reset method resets the whole object, not only sub-object + // of a parent class in which it is defined. + const MemRegion *WholeObjectRegion = ThisRegion; + while (const CXXBaseObjectRegion *BR = + dyn_cast<CXXBaseObjectRegion>(WholeObjectRegion)) + WholeObjectRegion = BR->getSuperRegion(); + + State = State->remove<TrackedRegionMap>(WholeObjectRegion); C.addTransition(State); return; } diff --git a/clang/test/Analysis/MisusedMovedObject.cpp b/clang/test/Analysis/MisusedMovedObject.cpp index 44e055fd407..57c1ecc912b 100644 --- a/clang/test/Analysis/MisusedMovedObject.cpp +++ b/clang/test/Analysis/MisusedMovedObject.cpp @@ -617,3 +617,11 @@ void subRegionMoveTest() { a.b.foo(); // no-warning } } + +class C: public A {}; +void resetSuperClass() { + C c; + C c1 = std::move(c); + c.clear(); + C c2 = c; // no-warning +} |

