14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This is a fake system header with divide-by-zero bugs introduced in
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// c++ std library functions. We use these bugs to test hard-coded
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// suppression of diagnostics within standard library functions that are known
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// to produce false positives.
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#pragma clang system_header
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef unsigned char uint8_t;
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef __typeof__(sizeof(int)) size_t;
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid *memmove(void *s1, const void *s2, size_t n);
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace std {
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <class _Tp>
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class allocator {
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void deallocate(void *p) {
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      ::delete p;
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <class _Alloc>
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class allocator_traits {
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    static void deallocate(void *p) {
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      _Alloc().deallocate(p);
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <class _Tp, class _Alloc>
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class __list_imp
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {};
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template <class _Tp, class _Alloc = allocator<_Tp> >
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class list
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  : private __list_imp<_Tp, _Alloc>
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  {
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void pop_front() {
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Fake use-after-free.
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // No warning is expected as we are suppressing warning coming
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // out of std::list.
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      int z = 0;
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      z = 5/z;
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool empty() const;
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // basic_string
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  template<class _CharT, class _Alloc = allocator<_CharT> >
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  class __attribute__ ((__type_visibility__("default"))) basic_string {
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    bool isLong;
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    union {
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      _CharT localStorage[4];
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      _CharT *externalStorage;
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      void assignExternal(_CharT *newExternal) {
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        externalStorage = newExternal;
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      }
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    } storage;
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    typedef allocator_traits<_Alloc> __alloc_traits;
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  public:
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    basic_string();
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    void push_back(int c) {
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Fake error trigger.
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // No warning is expected as we are suppressing warning coming
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // out of std::basic_string.
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      int z = 0;
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      z = 5/z;
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    _CharT *getBuffer() {
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      return isLong ? storage.externalStorage : storage.localStorage;
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    basic_string &operator +=(int c) {
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Fake deallocate stack-based storage.
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // No warning is expected as we are suppressing warnings within
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // std::basic_string.
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      __alloc_traits::deallocate(getBuffer());
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    basic_string &operator =(const basic_string &other) {
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // Fake deallocate stack-based storage, then use the variable in the
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // same union.
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // No warning is expected as we are suppressing warnings within
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      // std::basic_string.
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      __alloc_traits::deallocate(getBuffer());
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      storage.assignExternal(new _CharT[4]);
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    }
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  };
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate<class _Engine, class _UIntType>
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass __independent_bits_engine {
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // constructors and seeding functions
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  __independent_bits_engine(_Engine& __e, size_t __w);
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate<class _Engine, class _UIntType>
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar__independent_bits_engine<_Engine, _UIntType>
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    ::__independent_bits_engine(_Engine& __e, size_t __w)
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Fake error trigger.
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // No warning is expected as we are suppressing warning coming
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // out of std::__independent_bits_engine.
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int z = 0;
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  z = 5/z;
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#if __has_feature(cxx_decltype)
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef decltype(nullptr) nullptr_t;
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate<class _Tp>
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass shared_ptr
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar{
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  constexpr shared_ptr(nullptr_t);
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  explicit shared_ptr(_Tp* __p);
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  shared_ptr(shared_ptr&& __r) { }
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ~shared_ptr();
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  shared_ptr& operator=(shared_ptr&& __r) {
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // Fake error trigger.
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // No warning is expected as we are suppressing warning coming
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    // out of std::shared_ptr.
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    int z = 0;
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    z = 5/z;
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartemplate<class _Tp>
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarinline
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarconstexpr
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarshared_ptr<_Tp>::shared_ptr(nullptr_t) {
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif // __has_feature(cxx_decltype)
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
147