aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/smart-ptr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/smart-ptr.cpp')
-rw-r--r--test/Analysis/smart-ptr.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/Analysis/smart-ptr.cpp b/test/Analysis/smart-ptr.cpp
new file mode 100644
index 0000000000..ae6966b4e6
--- /dev/null
+++ b/test/Analysis/smart-ptr.cpp
@@ -0,0 +1,28 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection\
+// RUN: -analyzer-checker cplusplus.Move,cplusplus.SmartPtr\
+// RUN: -std=c++11 -verify %s
+
+#include "Inputs/system-header-simulator-cxx.h"
+
+void clang_analyzer_warnIfReached();
+
+void derefAfterMove(std::unique_ptr<int> P) {
+ std::unique_ptr<int> Q = std::move(P);
+ if (Q)
+ clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}}
+ *Q.get() = 1; // no-warning
+ if (P)
+ clang_analyzer_warnIfReached(); // no-warning
+ // TODO: Report a null dereference (instead).
+ *P.get() = 1; // expected-warning {{Method called on moved-from object 'P'}}
+}
+
+// Don't crash when attempting to model a call with unknown callee.
+namespace testUnknownCallee {
+struct S {
+ void foo();
+};
+void bar(S *s, void (S::*func)(void)) {
+ (s->*func)(); // no-crash
+}
+} // namespace testUnknownCallee