[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