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