1// This is a fake system header with divide-by-zero bugs introduced in
2// c++ std library functions. We use these bugs to test hard-coded
3// suppression of diagnostics within standard library functions that are known
4// to produce false positives.
5
6#pragma clang system_header
7
8typedef unsigned char uint8_t;
9
10typedef __typeof__(sizeof(int)) size_t;
11void *memmove(void *s1, const void *s2, size_t n);
12
13namespace std {
14
15  template <class _Tp>
16  class allocator {
17  public:
18    void deallocate(void *p) {
19      ::delete p;
20    }
21  };
22
23  template <class _Alloc>
24  class allocator_traits {
25  public:
26    static void deallocate(void *p) {
27      _Alloc().deallocate(p);
28    }
29  };
30
31  template <class _Tp, class _Alloc>
32  class __list_imp
33  {};
34
35  template <class _Tp, class _Alloc = allocator<_Tp> >
36  class list
37  : private __list_imp<_Tp, _Alloc>
38  {
39  public:
40    void pop_front() {
41      // Fake use-after-free.
42      // No warning is expected as we are suppressing warning coming
43      // out of std::list.
44      int z = 0;
45      z = 5/z;
46    }
47    bool empty() const;
48  };
49
50  // basic_string
51  template<class _CharT, class _Alloc = allocator<_CharT> >
52  class __attribute__ ((__type_visibility__("default"))) basic_string {
53    bool isLong;
54    union {
55      _CharT localStorage[4];
56      _CharT *externalStorage;
57
58      void assignExternal(_CharT *newExternal) {
59        externalStorage = newExternal;
60      }
61    } storage;
62
63    typedef allocator_traits<_Alloc> __alloc_traits;
64
65  public:
66    basic_string();
67
68    void push_back(int c) {
69      // Fake error trigger.
70      // No warning is expected as we are suppressing warning coming
71      // out of std::basic_string.
72      int z = 0;
73      z = 5/z;
74    }
75
76    _CharT *getBuffer() {
77      return isLong ? storage.externalStorage : storage.localStorage;
78    }
79
80    basic_string &operator +=(int c) {
81      // Fake deallocate stack-based storage.
82      // No warning is expected as we are suppressing warnings within
83      // std::basic_string.
84      __alloc_traits::deallocate(getBuffer());
85    }
86
87    basic_string &operator =(const basic_string &other) {
88      // Fake deallocate stack-based storage, then use the variable in the
89      // same union.
90      // No warning is expected as we are suppressing warnings within
91      // std::basic_string.
92      __alloc_traits::deallocate(getBuffer());
93      storage.assignExternal(new _CharT[4]);
94    }
95  };
96
97template<class _Engine, class _UIntType>
98class __independent_bits_engine {
99public:
100  // constructors and seeding functions
101  __independent_bits_engine(_Engine& __e, size_t __w);
102};
103
104template<class _Engine, class _UIntType>
105__independent_bits_engine<_Engine, _UIntType>
106    ::__independent_bits_engine(_Engine& __e, size_t __w)
107{
108  // Fake error trigger.
109  // No warning is expected as we are suppressing warning coming
110  // out of std::__independent_bits_engine.
111  int z = 0;
112  z = 5/z;
113}
114
115#if __has_feature(cxx_decltype)
116typedef decltype(nullptr) nullptr_t;
117
118template<class _Tp>
119class shared_ptr
120{
121public:
122  constexpr shared_ptr(nullptr_t);
123  explicit shared_ptr(_Tp* __p);
124
125  shared_ptr(shared_ptr&& __r) { }
126
127  ~shared_ptr();
128
129  shared_ptr& operator=(shared_ptr&& __r) {
130    // Fake error trigger.
131    // No warning is expected as we are suppressing warning coming
132    // out of std::shared_ptr.
133    int z = 0;
134    z = 5/z;
135  }
136};
137
138template<class _Tp>
139inline
140constexpr
141shared_ptr<_Tp>::shared_ptr(nullptr_t) {
142}
143
144#endif // __has_feature(cxx_decltype)
145}
146
147