system-header-simulator-cxx.h revision a12643622ad3b85972dfdd80fe9006a3e8d8fb80
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  };
622de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
632de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  class bad_alloc : public exception {
642de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    public:
652de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc() throw();
662de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc(const bad_alloc&) throw();
672de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    bad_alloc& operator=(const bad_alloc&) throw();
682de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    virtual const char* what() const throw() {
692de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev      return 0;
702de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev    }
712de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  };
722de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
732de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  struct nothrow_t {};
742de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
752de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev  extern const nothrow_t nothrow;
76a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose
77a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  template<class InputIter, class OutputIter>
78a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  OutputIter copy(InputIter II, InputIter IE, OutputIter OI) {
79a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    while (II != IE)
80a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose      *OI++ = *II++;
81a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose    return OI;
82a12643622ad3b85972dfdd80fe9006a3e8d8fb80Jordan Rose  }
8381fb50e8b120fc95dc0245b4112972d4d7cca3b5Jordan Rose}
842de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
852de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new(std::size_t, const std::nothrow_t&) throw();
862de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[](std::size_t, const std::nothrow_t&) throw();
872de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete(void*, const std::nothrow_t&) throw();
882de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[](void*, const std::nothrow_t&) throw();
892de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsev
902de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new (std::size_t size, void* ptr) throw() { return ptr; };
912de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid* operator new[] (std::size_t size, void* ptr) throw() { return ptr; };
922de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete (void* ptr, void*) throw() {};
932de19edab6001d2c17720d02fe0760b9b452192aAnton Yartsevvoid operator delete[] (void* ptr, void*) throw() {};
94