Skip to content

Commit a51fe4a

Browse files
committed
C++: Make the vector and iterator classes in 'ir.cpp' more realistic. This matches the one we use for dataflow tests.
1 parent 693c28a commit a51fe4a

File tree

6 files changed

+28566
-28084
lines changed

6 files changed

+28566
-28084
lines changed

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 8233 additions & 8050 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 7263 additions & 7186 deletions
Large diffs are not rendered by default.

cpp/ql/test/library-tests/ir/ir/ir.cpp

Lines changed: 83 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,28 +1055,75 @@ void Lambda(int x, const String& s) {
10551055
lambda_inits(6);
10561056
}
10571057

1058-
template<typename T>
1059-
struct vector {
1060-
struct iterator {
1061-
T* p;
1062-
iterator& operator++();
1063-
T& operator*() const;
1058+
namespace std {
1059+
template<class T>
1060+
struct remove_const { typedef T type; };
1061+
1062+
template<class T>
1063+
struct remove_const<const T> { typedef T type; };
1064+
1065+
// `remove_const_t<T>` removes any `const` specifier from `T`
1066+
template<class T>
1067+
using remove_const_t = typename remove_const<T>::type;
1068+
1069+
struct ptrdiff_t;
1070+
1071+
template<class I> struct iterator_traits;
1072+
1073+
template <class Category,
1074+
class value_type,
1075+
class difference_type = ptrdiff_t,
1076+
class pointer_type = value_type*,
1077+
class reference_type = value_type&>
1078+
struct iterator {
1079+
typedef Category iterator_category;
1080+
1081+
iterator();
1082+
iterator(iterator<Category, remove_const_t<value_type> > const &other); // non-const -> const conversion constructor
1083+
1084+
iterator &operator++();
1085+
iterator operator++(int);
1086+
iterator &operator--();
1087+
iterator operator--(int);
1088+
bool operator==(iterator other) const;
1089+
bool operator!=(iterator other) const;
1090+
reference_type operator*() const;
1091+
pointer_type operator->() const;
1092+
iterator operator+(int);
1093+
iterator operator-(int);
1094+
iterator &operator+=(int);
1095+
iterator &operator-=(int);
1096+
int operator-(iterator);
1097+
reference_type operator[](int);
1098+
};
1099+
1100+
struct input_iterator_tag {};
1101+
struct forward_iterator_tag : public input_iterator_tag {};
1102+
struct bidirectional_iterator_tag : public forward_iterator_tag {};
1103+
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
1104+
1105+
struct output_iterator_tag {};
1106+
1107+
template<typename T>
1108+
struct vector {
1109+
vector(T);
1110+
~vector();
1111+
1112+
using iterator = std::iterator<random_access_iterator_tag, T>;
1113+
using const_iterator = std::iterator<random_access_iterator_tag, const T>;
10641114

1065-
bool operator!=(iterator right) const;
1115+
iterator begin() const;
1116+
iterator end() const;
10661117
};
10671118

1068-
vector(T);
1069-
~vector();
1070-
iterator begin() const;
1071-
iterator end() const;
1072-
};
1119+
template<typename T>
1120+
bool operator==(typename vector<T>::iterator left, typename vector<T>::iterator right);
1121+
template<typename T>
1122+
bool operator!=(typename vector<T>::iterator left, typename vector<T>::iterator right);
10731123

1074-
template<typename T>
1075-
bool operator==(typename vector<T>::iterator left, typename vector<T>::iterator right);
1076-
template<typename T>
1077-
bool operator!=(typename vector<T>::iterator left, typename vector<T>::iterator right);
1124+
}
10781125

1079-
void RangeBasedFor(const vector<int>& v) {
1126+
void RangeBasedFor(const std::vector<int>& v) {
10801127
for (int e : v) {
10811128
if (e > 0) {
10821129
continue;
@@ -2151,21 +2198,21 @@ void initialization_with_destructor(bool b, char c) {
21512198
}
21522199

21532200
ClassWithDestructor x;
2154-
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
2201+
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
21552202
y.set_x('a');
21562203

2157-
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
2204+
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
21582205
y.set_x('a');
21592206
if (y.get_x() == 'b')
21602207
return;
21612208
}
21622209

2163-
for(vector<int> ys(1); int y : ys) {
2210+
for(std::vector<int> ys(1); int y : ys) {
21642211
if (y == 1)
21652212
return;
21662213
}
21672214

2168-
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
2215+
for(std::vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys) {
21692216
ClassWithDestructor z1;
21702217
ClassWithDestructor z2;
21712218
}
@@ -2243,7 +2290,7 @@ void ForDestructors() {
22432290
String s2;
22442291
}
22452292

2246-
for(String s : vector<String>(String("hello"))) {
2293+
for(String s : std::vector<String>(String("hello"))) {
22472294
String s2;
22482295
}
22492296

@@ -2331,4 +2378,18 @@ namespace return_routine_type {
23312378

23322379
}
23332380

2381+
2382+
using size_t = decltype(sizeof(0));
2383+
2384+
template<class T>
2385+
struct remove_const { typedef T type; };
2386+
2387+
template<class T>
2388+
struct remove_const<const T> { typedef T type; };
2389+
2390+
// `remove_const_t<T>` removes any `const` specifier from `T`
2391+
template<class T>
2392+
using remove_const_t = typename remove_const<T>::type;
2393+
2394+
23342395
// semmle-extractor-options: -std=c++20 --clang

0 commit comments

Comments
 (0)