[PATCH] D115867: [C++20] [Coroutines] Warning for always_inline coroutine
Chuanqi Xu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 22 18:11:22 PST 2021
ChuanqiXu updated this revision to Diff 395954.
ChuanqiXu added a comment.
Address comments
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D115867/new/
https://reviews.llvm.org/D115867
Files:
clang/include/clang/Basic/DiagnosticGroups.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaCoroutine.cpp
clang/test/SemaCXX/coroutines.cpp
Index: clang/test/SemaCXX/coroutines.cpp
===================================================================
--- clang/test/SemaCXX/coroutines.cpp
+++ clang/test/SemaCXX/coroutines.cpp
@@ -1443,3 +1443,8 @@
co_await missing_await_suspend{}; // expected-error {{no member named 'await_suspend' in 'missing_await_suspend'}}
co_await missing_await_resume{}; // expected-error {{no member named 'await_resume' in 'missing_await_resume'}}
}
+
+__attribute__((__always_inline__))
+void warn_always_inline() { // expected-warning {{a coroutine would be splitted into pieces and not every piece of coroutine would be guaranteed to be inlined}}
+ co_await suspend_always{};
+}
Index: clang/lib/Sema/SemaCoroutine.cpp
===================================================================
--- clang/lib/Sema/SemaCoroutine.cpp
+++ clang/lib/Sema/SemaCoroutine.cpp
@@ -1062,6 +1062,14 @@
return;
}
+ // The coroutine marked always inline might not be inlined properly in current
+ // compiler support. Since the coroutine would be splitted into pieces. And the
+ // call to resume() and destroy() functions might be indirect call. So that
+ // only the ramp function is guarantted to be inlined. It might be different to
+ // what users expects to. Emit a warning to tell it.
+ if (FD->hasAttr<AlwaysInlineAttr>())
+ Diag(FD->getLocation(), diag::warn_always_inline_coroutine);
+
// Coroutines [stmt.return]p1:
// A return statement shall not appear in a coroutine.
if (Fn->FirstReturnLoc.isValid()) {
Index: clang/include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11107,6 +11107,11 @@
def note_coroutine_function_declare_noexcept : Note<
"must be declared with 'noexcept'"
>;
+def warn_always_inline_coroutine : Warning<
+ "a coroutine would be splitted into pieces and not every piece of coroutine "
+ "would be guaranteed to be inlined"
+ >,
+ InGroup<AlwaysInlineCoroutine>;
} // end of coroutines issue category
let CategoryName = "Documentation Issue" in {
Index: clang/include/clang/Basic/DiagnosticGroups.td
===================================================================
--- clang/include/clang/Basic/DiagnosticGroups.td
+++ clang/include/clang/Basic/DiagnosticGroups.td
@@ -58,7 +58,9 @@
DiagGroup<"deprecated-experimental-coroutine">;
def DeprecatedCoroutine :
DiagGroup<"deprecated-coroutine", [DeprecatedExperimentalCoroutine]>;
-def Coroutine : DiagGroup<"coroutine", [CoroutineMissingUnhandledException, DeprecatedCoroutine]>;
+def AlwaysInlineCoroutine :
+ DiagGroup<"always-inline-coroutine">;
+def Coroutine : DiagGroup<"coroutine", [CoroutineMissingUnhandledException, DeprecatedCoroutine, AlwaysInlineCoroutine]>;
def ObjCBoolConstantConversion : DiagGroup<"objc-bool-constant-conversion">;
def ConstantConversion : DiagGroup<"constant-conversion",
[BitFieldConstantConversion,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115867.395954.patch
Type: text/x-patch
Size: 3055 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20211223/304f0eb4/attachment-0001.bin>
More information about the cfe-commits
mailing list