1*b8fdafe6SRoman Lebedev // RUN: %clang_cc1 %s -verify -fno-builtin -std=c++14 2*b8fdafe6SRoman Lebedev 3*b8fdafe6SRoman Lebedev using size_t = decltype(sizeof(int)); 4*b8fdafe6SRoman Lebedev 5*b8fdafe6SRoman Lebedev #define _diagnose_if(...) __attribute__((diagnose_if(__VA_ARGS__))) 6*b8fdafe6SRoman Lebedev 7*b8fdafe6SRoman Lebedev namespace operator_new { 8*b8fdafe6SRoman Lebedev struct T0 { 9*b8fdafe6SRoman Lebedev int j = 0; 10*b8fdafe6SRoman Lebedev static void *operator new(size_t i) _diagnose_if(i == sizeof(int), "yay", "warning"); // expected-note{{from 'diagnose_if'}} 11*b8fdafe6SRoman Lebedev }; 12*b8fdafe6SRoman Lebedev 13*b8fdafe6SRoman Lebedev struct T1 { 14*b8fdafe6SRoman Lebedev int j = 0; 15*b8fdafe6SRoman Lebedev static void *operator new[](size_t i) _diagnose_if(i == 8 * sizeof(int), "yay", "warning"); // expected-note 2{{from 'diagnose_if'}} 16*b8fdafe6SRoman Lebedev }; 17*b8fdafe6SRoman Lebedev run(int x)18*b8fdafe6SRoman Lebedevvoid run(int x) { 19*b8fdafe6SRoman Lebedev new T0; // expected-warning{{yay}} 20*b8fdafe6SRoman Lebedev new T1[8]; // expected-warning{{yay}} 21*b8fdafe6SRoman Lebedev new T1[4][2]; // expected-warning{{yay}} 22*b8fdafe6SRoman Lebedev new T1[x]; // no warning. 23*b8fdafe6SRoman Lebedev } 24*b8fdafe6SRoman Lebedev } // namespace operator_new 25