================
@@ -0,0 +1,71 @@
+// RUN: %clang_analyze_cc1 -std=c++11 
-analyzer-checker=core,alpha.cplusplus.IteratorRange,debug.DebugIteratorModeling,debug.ExprInspection
 -analyzer-config aggressive-binary-operation-simplification=true 
-analyzer-config c++-container-inlining=false -verify %s
+// RUN: %clang_analyze_cc1 -std=c++11 
-analyzer-checker=core,alpha.cplusplus.IteratorRange,debug.DebugIteratorModeling,debug.ExprInspection
 -analyzer-config aggressive-binary-operation-simplification=true 
-analyzer-config c++-container-inlining=true -verify %s
+
+#include "Inputs/system-header-simulator-cxx.h"
+
+template <typename Iterator>
+long clang_analyzer_iterator_position(const Iterator &);
+template <typename Iterator>
+void *clang_analyzer_iterator_container(const Iterator &);
+void clang_analyzer_eval(bool);
+
+// Constrain the abstract offset so that advancing it produces a concrete 
value.
+void prefix_increment(const std::vector<int> &V) {
+  auto I = V.begin();
+  if (clang_analyzer_iterator_position(I) != 1)
+    return;
+
+  auto J = ++I;
+  clang_analyzer_eval(clang_analyzer_iterator_container(I) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_container(J) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_position(I) ==
+                      clang_analyzer_iterator_position(J)); // 
expected-warning@-1{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_position(I) == 2); // 
expected-warning{{TRUE}} expected-warning{{FALSE}}
+}
+
+void postfix_increment(const std::vector<int> &V) {
+  auto I = V.begin();
+  if (clang_analyzer_iterator_position(I) != 1)
+    return;
+
+  auto J = I++;
+  clang_analyzer_eval(clang_analyzer_iterator_container(I) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_container(J) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_position(J) == 1); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_position(I) == 2); // 
expected-warning{{TRUE}} expected-warning{{FALSE}}
+}
+
+void prefix_decrement(const std::vector<int> &V) {
+  auto I = V.end();
+  if (clang_analyzer_iterator_position(I) != 1)
+    return;
+
+  auto J = --I;
+  clang_analyzer_eval(clang_analyzer_iterator_container(I) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_container(J) == &V); // 
expected-warning{{TRUE}}
+  clang_analyzer_eval(clang_analyzer_iterator_position(I) ==
+                      clang_analyzer_iterator_position(J)); // 
expected-warning@-1{{TRUE}}
----------------
steakhal wrote:

This line looks pretty weird. We have a line break in the middle then in the 
end a relative reference to the previous line. I think it would be more 
readable this way:


```suggestion
  // expected-warning@+1{{TRUE}}
  clang_analyzer_eval(clang_analyzer_iterator_position(I) ==
                      clang_analyzer_iterator_position(J));
```

https://github.com/llvm/llvm-project/pull/232622
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to