Author: Artem Dergachev Date: 2020-08-07T10:39:28-07:00 New Revision: 47cadd6106c0a9218f653760dd045cbd16df0fd6
URL: https://github.com/llvm/llvm-project/commit/47cadd6106c0a9218f653760dd045cbd16df0fd6 DIFF: https://github.com/llvm/llvm-project/commit/47cadd6106c0a9218f653760dd045cbd16df0fd6.diff LOG: [analyzer] pr47030: MoveChecker: Unforget a comma in the suppression list. Added: Modified: clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp clang/test/Analysis/Inputs/system-header-simulator-cxx.h clang/test/Analysis/use-after-move.cpp Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp index da3ce01d032b..a38298a7abed 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MoveChecker.cpp @@ -104,7 +104,7 @@ class MoveChecker "basic_ios", "future", "optional", - "packaged_task" + "packaged_task", "promise", "shared_future", "shared_lock", diff --git a/clang/test/Analysis/Inputs/system-header-simulator-cxx.h b/clang/test/Analysis/Inputs/system-header-simulator-cxx.h index 9010ce2bb9b6..a0759479bfeb 100644 --- a/clang/test/Analysis/Inputs/system-header-simulator-cxx.h +++ b/clang/test/Analysis/Inputs/system-header-simulator-cxx.h @@ -1133,4 +1133,9 @@ class default_searcher { operator()( ForwardIt2 first, ForwardIt2 last ) const; }; -} +template <typename> class packaged_task; +template <typename Ret, typename... Args> class packaged_task<Ret(Args...)> { + // TODO: Add some actual implementation. +}; + +} // namespace std diff --git a/clang/test/Analysis/use-after-move.cpp b/clang/test/Analysis/use-after-move.cpp index d7b6c74fabd6..d1278cad4c4f 100644 --- a/clang/test/Analysis/use-after-move.cpp +++ b/clang/test/Analysis/use-after-move.cpp @@ -974,3 +974,19 @@ void getAfterMove(std::unique_ptr<A> P) { // TODO: Warn on a null dereference here. a->foo(); } + +struct OtherMoveSafeClasses { + std::packaged_task<int(void)> Task; + + void test() { + // Test the suppression caused by use-after-move semantics of + // std::package_task being diff erent from other standard classes. + // Only warn in aggressive mode. Don't say that the object + // is left in unspecified state after move. + std::packaged_task<int(void)> Task2 = std::move(Task); + // aggressive-note@-1 {{Object 'Task' is moved}} + std::packaged_task<int(void)> Task3 = std::move(Task); + // aggressive-warning@-1{{Moved-from object 'Task' is moved}} + // aggressive-note@-2 {{Moved-from object 'Task' is moved}} + } +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits