[clang] [clang] Simplify the overload resolution logic for operator new and new[] (PR #211482)

Oliver Hunt via cfe-commits cfe-commits at lists.llvm.org
Tue Jul 28 18:06:13 PDT 2026


================
@@ -0,0 +1,25 @@
+// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -std=c++26 \
+// RUN: -fno-aligned-allocation -Wno-ext-cxx-type-aware-allocators -verify %s
+
+void first() {
+  new int;
+}
+
+namespace std {
+  using size_t = __SIZE_TYPE__;
+  template <class T> struct type_identity { using type = T; };
+  enum class align_val_t : size_t {};
+}
+
+template <class T> void *operator new(std::type_identity<T>, std::size_t, std::align_val_t) = delete; // #new_decl
+template <class T> void operator delete(std::type_identity<T>, void *, std::size_t, std::align_val_t) = delete;
+
+struct Foo {
+  int x; 
+};
+
+void second() {
+  (void)new Foo; // #new_expr
+  // expected-error@#new_expr {{call to deleted function 'operator new'}}
+  // expected-note@#new_decl {{candidate function [with T = Foo] has been explicitly deleted}}
+}
----------------
ojhunt wrote:

Bug found by Claude: the align_val_t cache was gated on size, so if aligned allocation is not enabled align_val_t is not defined implicitly, so a call to new that occurs prior to an explicitly defined align_val_t we never construct the align val t parameter and then incorrect allocation is called.

https://github.com/llvm/llvm-project/pull/211482


More information about the cfe-commits mailing list