Author: Chuanqi Xu Date: 2023-02-07T00:22:22+08:00 New Revision: d2b0b26132ce5d3d9022edbf274f01e9de764673
URL: https://github.com/llvm/llvm-project/commit/d2b0b26132ce5d3d9022edbf274f01e9de764673 DIFF: https://github.com/llvm/llvm-project/commit/d2b0b26132ce5d3d9022edbf274f01e9de764673.diff LOG: [Coroutines] Pass size parameter for deallocation function when qualified Close https://github.com/llvm/llvm-project/issues/60545. Previously, we would only pass the size parameter to the deallocation function if the type is completely the same. But it is good enough to make them unqualified the smae. Added: Modified: clang/lib/Sema/SemaCoroutine.cpp clang/test/SemaCXX/coroutine-dealloc.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp index 79c08adb8fab..9678e30699c8 100644 --- a/clang/lib/Sema/SemaCoroutine.cpp +++ b/clang/lib/Sema/SemaCoroutine.cpp @@ -1562,7 +1562,7 @@ bool CoroutineStmtBuilder::makeNewAndDeleteExpr() { const auto *OpDeleteType = OpDeleteQualType.getTypePtr()->castAs<FunctionProtoType>(); if (OpDeleteType->getNumParams() > DeleteArgs.size() && - S.getASTContext().hasSameType( + S.getASTContext().hasSameUnqualifiedType( OpDeleteType->getParamType(DeleteArgs.size()), FrameSize->getType())) DeleteArgs.push_back(FrameSize); @@ -1579,7 +1579,7 @@ bool CoroutineStmtBuilder::makeNewAndDeleteExpr() { // So we are not forced to pass alignment to the deallocation function. if (S.getLangOpts().CoroAlignedAllocation && OpDeleteType->getNumParams() > DeleteArgs.size() && - S.getASTContext().hasSameType( + S.getASTContext().hasSameUnqualifiedType( OpDeleteType->getParamType(DeleteArgs.size()), FrameAlignment->getType())) DeleteArgs.push_back(FrameAlignment); diff --git a/clang/test/SemaCXX/coroutine-dealloc.cpp b/clang/test/SemaCXX/coroutine-dealloc.cpp index 6eca1e6f42f8..762a14465b29 100644 --- a/clang/test/SemaCXX/coroutine-dealloc.cpp +++ b/clang/test/SemaCXX/coroutine-dealloc.cpp @@ -25,3 +25,19 @@ struct task { task f() { co_return 43; } + +// From https://github.com/llvm/llvm-project/issues/60545 +struct generator { + struct promise_type { + generator get_return_object(); + std::suspend_always initial_suspend(); + std::suspend_always final_suspend() noexcept; + void return_void(); + [[noreturn]] void unhandled_exception(); + + static void* operator new(std::size_t size); + static void operator delete(void* ptr, const std::size_t size); + }; +}; + +generator goo() { co_return; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits