// This is a fake system header with divide-by-zero bugs introduced in // c++ std library functions. We use these bugs to test hard-coded // suppression of diagnostics within standard library functions that are known // to produce false positives. #pragma clang system_header typedef unsigned char uint8_t; typedef __typeof__(sizeof(int)) size_t; void *memmove(void *s1, const void *s2, size_t n); namespace std { template <class _Tp> class allocator { public: void deallocate(void *p) { ::delete p; } }; template <class _Alloc> class allocator_traits { public: static void deallocate(void *p) { _Alloc().deallocate(p); } }; template <class _Tp, class _Alloc> class __list_imp {}; template <class _Tp, class _Alloc = allocator<_Tp> > class list : private __list_imp<_Tp, _Alloc> { public: void pop_front() { // Fake use-after-free. // No warning is expected as we are suppressing warning coming // out of std::list. int z = 0; z = 5/z; } bool empty() const; }; // basic_string template<class _CharT, class _Alloc = allocator<_CharT> > class __attribute__ ((__type_visibility__("default"))) basic_string { bool isLong; union { _CharT localStorage[4]; _CharT *externalStorage; void assignExternal(_CharT *newExternal) { externalStorage = newExternal; } } storage; typedef allocator_traits<_Alloc> __alloc_traits; public: basic_string(); void push_back(int c) { // Fake error trigger. // No warning is expected as we are suppressing warning coming // out of std::basic_string. int z = 0; z = 5/z; } _CharT *getBuffer() { return isLong ? storage.externalStorage : storage.localStorage; } basic_string &operator +=(int c) { // Fake deallocate stack-based storage. // No warning is expected as we are suppressing warnings within // std::basic_string. __alloc_traits::deallocate(getBuffer()); } basic_string &operator =(const basic_string &other) { // Fake deallocate stack-based storage, then use the variable in the // same union. // No warning is expected as we are suppressing warnings within // std::basic_string. __alloc_traits::deallocate(getBuffer()); storage.assignExternal(new _CharT[4]); } }; template<class _Engine, class _UIntType> class __independent_bits_engine { public: // constructors and seeding functions __independent_bits_engine(_Engine& __e, size_t __w); }; template<class _Engine, class _UIntType> __independent_bits_engine<_Engine, _UIntType> ::__independent_bits_engine(_Engine& __e, size_t __w) { // Fake error trigger. // No warning is expected as we are suppressing warning coming // out of std::__independent_bits_engine. int z = 0; z = 5/z; } #if __has_feature(cxx_decltype) typedef decltype(nullptr) nullptr_t; template<class _Tp> class shared_ptr { public: constexpr shared_ptr(nullptr_t); explicit shared_ptr(_Tp* __p); shared_ptr(shared_ptr&& __r) { } ~shared_ptr(); shared_ptr& operator=(shared_ptr&& __r) { // Fake error trigger. // No warning is expected as we are suppressing warning coming // out of std::shared_ptr. int z = 0; z = 5/z; } }; template<class _Tp> inline constexpr shared_ptr<_Tp>::shared_ptr(nullptr_t) { } #endif // __has_feature(cxx_decltype) }