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 Dergachev void *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 Dergachev void *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 Dergachev void 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 Dergachev void 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