|  | // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-store region -std=c++11 -fexceptions -fcxx-exceptions -verify %s | 
|  | // RUN: %clang_analyze_cc1 -analyzer-checker=core,debug.ExprInspection -analyzer-store region -std=c++11 -verify %s | 
|  |  | 
|  | void clang_analyzer_eval(bool); | 
|  |  | 
|  | typedef __typeof__(sizeof(int)) size_t; | 
|  | extern "C" void *malloc(size_t); | 
|  |  | 
|  | // This is the standard placement new. | 
|  | inline void* operator new(size_t, void* __p) throw() | 
|  | { | 
|  | return __p; | 
|  | } | 
|  |  | 
|  | struct NoThrow { | 
|  | void *operator new(size_t) throw(); | 
|  | }; | 
|  |  | 
|  | struct NoExcept { | 
|  | void *operator new(size_t) noexcept; | 
|  | }; | 
|  |  | 
|  | struct DefaultThrow { | 
|  | void *operator new(size_t); | 
|  | }; | 
|  |  | 
|  | struct ExplicitThrow { | 
|  | void *operator new(size_t) throw(int); | 
|  | }; | 
|  |  | 
|  | void testNew() { | 
|  | clang_analyzer_eval(new NoThrow); // expected-warning{{UNKNOWN}} | 
|  | clang_analyzer_eval(new NoExcept); // expected-warning{{UNKNOWN}} | 
|  |  | 
|  | clang_analyzer_eval(new DefaultThrow); // expected-warning{{TRUE}} | 
|  | clang_analyzer_eval(new ExplicitThrow); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  | void testNewArray() { | 
|  | clang_analyzer_eval(new NoThrow[2]); // expected-warning{{TRUE}} | 
|  | clang_analyzer_eval(new NoExcept[2]); // expected-warning{{TRUE}} | 
|  | clang_analyzer_eval(new DefaultThrow[2]); // expected-warning{{TRUE}} | 
|  | clang_analyzer_eval(new ExplicitThrow[2]); // expected-warning{{TRUE}} | 
|  | } | 
|  |  | 
|  | extern void *operator new[](size_t, int) noexcept; | 
|  |  | 
|  | void testNewArrayNoThrow() { | 
|  | clang_analyzer_eval(new (1) NoThrow[2]); // expected-warning{{UNKNOWN}} | 
|  | clang_analyzer_eval(new (1) NoExcept[2]); // expected-warning{{UNKNOWN}} | 
|  | clang_analyzer_eval(new (1) DefaultThrow[2]); // expected-warning{{UNKNOWN}} | 
|  | clang_analyzer_eval(new (1) ExplicitThrow[2]); // expected-warning{{UNKNOWN}} | 
|  | } |