================ @@ -13,10 +15,41 @@ struct Bar { struct Baz { virtual ~Baz() {} - static void operator delete[](void* ptr) = delete; // expected-note {{explicitly marked deleted here}} + static void operator delete[](void* ptr) = delete; // expected-note {{explicitly marked deleted here}}\ + ms-note{{explicitly marked deleted here}}} +}; + +struct BarBaz { + ~BarBaz() {} + static void operator delete[](void* ptr) = delete; }; void foobar() { - Baz *B = new Baz[10](); + Baz *B = new Baz[10](); // ms-error {{attempt to use a deleted function}} delete [] B; // expected-error {{attempt to use a deleted function}} + BarBaz *BB = new BarBaz[10](); +} + +struct BaseDelete1 { + void operator delete[](void *); //ms-note 2{{member found by ambiguous name lookup}} +}; +struct BaseDelete2 { + void operator delete[](void *); //ms-note 2{{member found by ambiguous name lookup}} +}; +struct BaseDestructor { + BaseDestructor() {} + virtual ~BaseDestructor() = default; +}; +struct Final : BaseDelete1, BaseDelete2, BaseDestructor { + Final() {} +}; + +#ifdef MS +struct Final1 : BaseDelete1, BaseDelete2, BaseDestructor { + __declspec(dllexport) ~Final1() {} // ms-error {{member 'operator delete[]' found in multiple base classes of different types}} +}; +#endif // MS ---------------- rnk wrote:
Maybe throw in a third case for good measure: an explicit, inline, non-exported destructor, with ambiguous lookup. I'm guessing we want the same diagnostics we get for `Final`, i.e. we emit the diagnostic only when array-new gets called, as in the case with the implicit destructor. https://github.com/llvm/llvm-project/pull/135041 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits