system-header-simulator-cxx.h revision 8c888b10fdd2846885e8582b131fa076ce1b77b1
18c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// Like the compiler, the static analyzer treats some functions differently if
28c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// they come from a system header -- for example, it is assumed that system
38c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// functions do not arbitrarily free() their parameters, and that some bugs
48c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// found in system headers cannot be fixed by the user and should be
58c888b10fdd2846885e8582b131fa076ce1b77b1Jordan Rose// suppressed.
681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose#pragma clang system_header
781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rosenamespace std {
981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template <class T1, class T2>
1081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  struct pair {
1181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T1 first;
1281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T2 second;
1381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair() : first(), second() {}
1581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const T1 &a, const T2 &b) : first(a), second(b) {}
1681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
1781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    template<class U1, class U2>
1881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    pair(const pair<U1, U2> &other) : first(other.first), second(other.second) {}
1981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
2081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  typedef __typeof__(sizeof(int)) size_t;
2281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
2381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  template<typename T>
2481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class vector {
2581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_start;
2681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_finish;
2781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *_end_of_storage;
2881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
2981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    vector() : _start(0), _finish(0), _end_of_storage(0) {}
3081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    ~vector();
3181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    size_t size() const {
3381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return size_t(_finish - _start);
3481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
3581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    void push_back();
3781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T pop_back();
3881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
3981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T &operator[](size_t n) {
4081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T &operator[](size_t n) const {
4481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return _start[n];
4581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
4681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
4781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *begin() { return _start; }
4881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *begin() const { return _start; }
4981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    T *end() { return _finish; }
5181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    const T *end() const { return _finish; }
5281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
5381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose
5481fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  class exception {
5581fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  public:
5681fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    exception() throw();
5781fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual ~exception() throw();
5881fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    virtual const char *what() const throw() {
5981fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose      return 0;
6081fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose    }
6181fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose  };
6281fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
63