blob: 6e434a04b23df4beebaa360613afdc55047ff0a2 [file] [log] [blame]
Jordan Roseb54cfa32013-02-01 19:50:01 +00001// Like the compiler, the static analyzer treats some functions differently if
2// they come from a system header -- for example, it is assumed that system
3// functions do not arbitrarily free() their parameters, and that some bugs
4// found in system headers cannot be fixed by the user and should be
5// suppressed.
Jordan Rose1e0e4002012-09-10 21:27:35 +00006#pragma clang system_header
7
8namespace std {
9 template <class T1, class T2>
10 struct pair {
11 T1 first;
12 T2 second;
13
14 pair() : first(), second() {}
15 pair(const T1 &a, const T2 &b) : first(a), second(b) {}
16
17 template<class U1, class U2>
18 pair(const pair<U1, U2> &other) : first(other.first), second(other.second) {}
19 };
20
21 typedef __typeof__(sizeof(int)) size_t;
22
23 template<typename T>
24 class vector {
25 T *_start;
26 T *_finish;
27 T *_end_of_storage;
28 public:
29 vector() : _start(0), _finish(0), _end_of_storage(0) {}
30 ~vector();
31
32 size_t size() const {
33 return size_t(_finish - _start);
34 }
35
36 void push_back();
37 T pop_back();
38
39 T &operator[](size_t n) {
40 return _start[n];
41 }
42
43 const T &operator[](size_t n) const {
44 return _start[n];
45 }
46
47 T *begin() { return _start; }
48 const T *begin() const { return _start; }
49
50 T *end() { return _finish; }
51 const T *end() const { return _finish; }
52 };
53
54 class exception {
55 public:
56 exception() throw();
57 virtual ~exception() throw();
58 virtual const char *what() const throw() {
59 return 0;
60 }
61 };
Anton Yartsev13df0362013-03-25 01:35:45 +000062
63 class bad_alloc : public exception {
64 public:
65 bad_alloc() throw();
66 bad_alloc(const bad_alloc&) throw();
67 bad_alloc& operator=(const bad_alloc&) throw();
68 virtual const char* what() const throw() {
69 return 0;
70 }
71 };
72
73 struct nothrow_t {};
74
75 extern const nothrow_t nothrow;
Jordan Rosed11ef1a2013-04-02 00:26:15 +000076
77 template<class InputIter, class OutputIter>
78 OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
79 while (II != IE)
80 *OI++ = *II++;
81 return OI;
82 }
Jordan Rose7023a902013-05-01 22:39:31 +000083
84 struct input_iterator_tag { };
85 struct output_iterator_tag { };
86 struct forward_iterator_tag : public input_iterator_tag { };
87 struct bidirectional_iterator_tag : public forward_iterator_tag { };
88 struct random_access_iterator_tag : public bidirectional_iterator_tag { };
Jordan Rose1e0e4002012-09-10 21:27:35 +000089}
Anton Yartsev13df0362013-03-25 01:35:45 +000090
91void* operator new(std::size_t, const std::nothrow_t&) throw();
92void* operator new[](std::size_t, const std::nothrow_t&) throw();
93void operator delete(void*, const std::nothrow_t&) throw();
94void operator delete[](void*, const std::nothrow_t&) throw();
95
96void* operator new (std::size_t size, void* ptr) throw() { return ptr; };
97void* operator new[] (std::size_t size, void* ptr) throw() { return ptr; };
98void operator delete (void* ptr, void*) throw() {};
99void operator delete[] (void* ptr, void*) throw() {};