1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++98
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef __SIZE_TYPE__ size_t;
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct S1 {
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new(size_t n) {
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return nullptr; // expected-warning {{'operator new' should not return a null pointer unless it is declared 'throw()' or 'noexcept'}}
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new[](size_t n) noexcept {
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return __null;
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct S2 {
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   static size_t x;
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new(size_t n) throw() {
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return 0;
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new[](size_t n) {
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return (void*)0;
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     // expected-warning@-2 {{'operator new[]' should not return a null pointer unless it is declared 'throw()' or 'noexcept'}}
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     // expected-warning-re@-4 {{'operator new[]' should not return a null pointer unless it is declared 'throw()'{{$}}}}
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct S3 {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new(size_t n) {
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return 1-1;
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     // expected-error@-2 {{cannot initialize return object of type 'void *' with an rvalue of type 'int'}}
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#else
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     // expected-warning@-4 {{expression which evaluates to zero treated as a null pointer constant of type 'void *'}}
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     // expected-warning@-5 {{'operator new' should not return a null pointer unless it is declared 'throw()'}}
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   void *operator new[](size_t n) {
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines     return (void*)(1-1); // expected-warning {{'operator new[]' should not return a null pointer unless it is declared 'throw()'}}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines   }
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#if __cplusplus >= 201103L
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<bool B> struct S4 {
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void *operator new(size_t n) noexcept(B) {
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0; // expected-warning {{'operator new' should not return a null pointer}}
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate struct S4<true>;
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate struct S4<false>; // expected-note {{in instantiation of}}
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#endif
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate<typename ...T> struct S5 { // expected-warning 0-1{{extension}}
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void *operator new(size_t n) throw(T...) {
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return 0; // expected-warning {{'operator new' should not return a null pointer}}
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate struct S5<>;
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate struct S5<int>; // expected-note {{in instantiation of}}
64