================
@@ -0,0 +1,145 @@
+// RUN: %clang_cc1 -triple arm64-apple-macosx -fsyntax-only -verify %s 
-std=c++26 -fcoroutines -fexceptions -Wall -Wpedantic
+
+
+#include "Inputs/std-coroutine.h"
+
+namespace std {
+   template <typename T> struct type_identity {
+   typedef T type;
+   };
+   typedef __SIZE_TYPE__ size_t;
+   enum class align_val_t : size_t {};
+}
+
+struct Allocator {};
+
+struct resumable {
+  struct promise_type {
+    void *operator new(std::type_identity<promise_type>, std::size_t sz, 
std::align_val_t, int); // #resumable_tan1
+    void *operator new(std::type_identity<promise_type>, std::size_t sz, 
std::align_val_t, float); // #resumable_tan2
+    void operator delete(std::type_identity<promise_type>, void *, std::size_t 
sz, std::align_val_t); // #resumable_tad1
+    template <typename T> void operator delete(std::type_identity<T>, void *, 
std::size_t sz, std::align_val_t) = delete; // #resumable_tad2
+
+    resumable get_return_object() { return {}; }
+    auto initial_suspend() { return std::suspend_always(); }
+    auto final_suspend() noexcept { return std::suspend_always(); }
+    void unhandled_exception() {}
+    void return_void(){};
+    std::suspend_always yield_value(int i);
+  };
+};
+
+struct resumable2 {
+  struct promise_type {
+    template <typename... Args> void *operator 
new(std::type_identity<promise_type>, std::size_t sz, std::align_val_t, 
Args...); // #resumable2_tan1
+    void operator delete(std::type_identity<promise_type>, void *, std::size_t 
sz, std::align_val_t); // #resumable2_tad2
+
+    resumable2 get_return_object() { return {}; }
+    auto initial_suspend() { return std::suspend_always(); }
+    auto final_suspend() noexcept { return std::suspend_always(); }
+    void unhandled_exception() {}
+    void return_void(){};
+    std::suspend_always yield_value(int i);
+  };
+};
+
+
+struct resumable3 {
+  struct promise_type {
+  // expected-error@-1 {{declaration of type aware 'operator new' in 
'resumable3::promise_type' must have matching type aware 'operator delete'}}
+  // expected-note@#resumable3_tan {{unmatched type aware 'operator new' 
declared here}}
+    void *operator new(std::size_t sz, float);
+    void *operator new(std::type_identity<promise_type>, std::size_t sz, 
std::align_val_t, float); // #resumable3_tan
+    void operator delete(void *);
+
+    resumable3 get_return_object() { return {}; }
+    auto initial_suspend() { return std::suspend_always(); }
+    auto final_suspend() noexcept { return std::suspend_always(); }
+    void unhandled_exception() {}
+    void return_void(){};
+    std::suspend_always yield_value(int i);
+  };
+};
+struct resumable4 {
+  struct promise_type {
+    // expected-error@-1 {{declaration of type aware 'operator delete' in 
'resumable4::promise_type' must have matching type aware 'operator new'}}
+    // expected-note@#resumable4_tad {{unmatched type aware 'operator delete' 
declared here}}
+    void *operator new(std::size_t sz, float);
+    template <typename T> void operator delete(std::type_identity<T>, void *, 
std::size_t, std::align_val_t); // #resumable4_tad
+
+    resumable4 get_return_object() { return {}; }
+    auto initial_suspend() { return std::suspend_always(); }
+    auto final_suspend() noexcept { return std::suspend_always(); }
+    void unhandled_exception() {}
+    void return_void(){};
+    std::suspend_always yield_value(int i);
+  };
+};
+struct resumable5 {
+  struct promise_type {
+    // expected-error@-1 {{declaration of type aware 'operator delete' in 
'resumable5::promise_type' must have matching type aware 'operator new'}}
+    // expected-note@#resumable5_tad {{unmatched type aware 'operator delete' 
declared here}}
+    void *operator new(std::size_t sz, float);
+    void operator delete(void *);
+    template <typename T> void operator delete(std::type_identity<T>, void *, 
std::size_t, std::align_val_t); // #resumable5_tad
+
+    resumable5 get_return_object() { return {}; }
+    auto initial_suspend() { return std::suspend_always(); }
+    auto final_suspend() noexcept { return std::suspend_always(); }
+    void unhandled_exception() {}
+    void return_void(){};
+    std::suspend_always yield_value(int i);
+  };
+};
+
+resumable f1(int) {
+  // expected-error@-1 {{'operator new' provided by 
'std::coroutine_traits<resumable, int>::promise_type' (aka 
'resumable::promise_type') is not usable with the function signature of 'f1'}}
+  // expected-note@-2 {{type aware 'operator new' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable_tan1 {{type aware 'operator new' declared here}}
+  // expected-note@#resumable_tan2 {{type aware 'operator new' declared here}}
+  co_return;
+}
+
+resumable f2(float) {
+  // expected-error@-1 {{'operator new' provided by 
'std::coroutine_traits<resumable, float>::promise_type' (aka 
'resumable::promise_type') is not usable with the function signature of 'f2'}}
+  // expected-note@-2 {{type aware 'operator new' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable_tan1 {{type aware 'operator new' declared here}}
+  // expected-note@#resumable_tan2 {{type aware 'operator new' declared here}}
+  co_return;
+}
+
+resumable2 f3(int, float, const char*, Allocator) {
+  // expected-error@-1 {{'operator new' provided by 
'std::coroutine_traits<resumable2, int, float, const char *, 
Allocator>::promise_type' (aka 'resumable2::promise_type') is not usable with 
the function signature of 'f3'}}
+  // expected-note@-2 {{type aware 'operator new' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable2_tan1 {{type aware 'operator new' declared here}}
+  co_yield 1;
+  co_return;
+}
+
+resumable f4(int n = 10) {
+  // expected-error@-1 {{'operator new' provided by 
'std::coroutine_traits<resumable, int>::promise_type' (aka 
'resumable::promise_type') is not usable with the function signature of 'f4'}}
+  // expected-note@-2 {{type aware 'operator new' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable_tan1 {{type aware 'operator new' declared here}}
+  // expected-note@#resumable_tan2 {{type aware 'operator new' declared here}}
+  for (int i = 0; i < n; i++)
+    co_yield i;
+}
+resumable3 f5(float) {
+  // expected-warning@-1 {{type aware 'operator new' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable3_tan {{type aware 'operator new' declared here}}
+  co_return;
+}
+
+resumable4 f6(float) {
+  // expected-error@-1 {{no suitable member 'operator delete' in 
'promise_type'}}
+  // expected-warning@-2 {{type aware 'operator delete' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable4_tad {{type aware 'operator delete' declared 
here}}
+  // expected-note@#resumable4_tad {{member 'operator delete' declared here}}
+  co_return;
+}
+
+resumable5 f7(float) {
+  // expected-warning@-1 {{type aware 'operator delete' will not be used for 
coroutine allocation}}
+  // expected-note@#resumable5_tad {{type aware 'operator delete' declared 
here}}
+  co_return;
+}
----------------
ojhunt wrote:

fixed

https://github.com/llvm/llvm-project/pull/113510
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to