1b0914e72SArtem Dergachev // RUN: %clang_analyze_cc1 -std=c++14 \ 2077f13c6SCsaba Dabis // RUN: -analyzer-checker=core,debug.ExprInspection \ 3077f13c6SCsaba Dabis // RUN: -verify %s 41084de52SArtem Dergachev 51084de52SArtem Dergachev void clang_analyzer_eval(bool); 650e0372fSArtem Dergachev void clang_analyzer_warnIfReached(); 71084de52SArtem Dergachev 81084de52SArtem Dergachev typedef __typeof__(sizeof(int)) size_t; 91084de52SArtem Dergachev operator new(size_t size)101084de52SArtem Dergachevvoid *operator new(size_t size) throw() { 111084de52SArtem Dergachev return nullptr; 12*3dd5a298SRoman Lebedev // expected-warning@-1 {{null returned from function that requires a non-null return value}} 131084de52SArtem Dergachev } operator new[](size_t size)141084de52SArtem Dergachevvoid *operator new[](size_t size) throw() { 151084de52SArtem Dergachev return nullptr; 16*3dd5a298SRoman Lebedev // expected-warning@-1 {{null returned from function that requires a non-null return value}} 171084de52SArtem Dergachev } 181084de52SArtem Dergachev 191084de52SArtem Dergachev struct S { 201084de52SArtem Dergachev int x; SS2150e0372fSArtem Dergachev S() : x(1) { 2250e0372fSArtem Dergachev // FIXME: Constructor should not be called with null this, even if it was 2350e0372fSArtem Dergachev // returned by operator new(). 2450e0372fSArtem Dergachev clang_analyzer_warnIfReached(); // expected-warning{{REACHABLE}} 2550e0372fSArtem Dergachev } ~SS261084de52SArtem Dergachev ~S() {} 271084de52SArtem Dergachev }; 281084de52SArtem Dergachev testArrays()291084de52SArtem Dergachevvoid testArrays() { 301084de52SArtem Dergachev S *s = new S[10]; // no-crash 31077f13c6SCsaba Dabis s[0].x = 2; 32077f13c6SCsaba Dabis // no-warning: 'Dereference of null pointer' suppressed by ReturnVisitor. 331084de52SArtem Dergachev } 3450e0372fSArtem Dergachev 3550e0372fSArtem Dergachev int global; testInvalidationOnConstructionIntoNull()3650e0372fSArtem Dergachevvoid testInvalidationOnConstructionIntoNull() { 3750e0372fSArtem Dergachev global = 0; 3850e0372fSArtem Dergachev S *s = new S(); 3950e0372fSArtem Dergachev // FIXME: Should be FALSE - we should not invalidate globals. 4050e0372fSArtem Dergachev clang_analyzer_eval(global); // expected-warning{{UNKNOWN}} 4150e0372fSArtem Dergachev } 42