[clang] b50fea4 - [clang] Allow using std::coroutine_traits in std::experimental
Nathan Sidwell via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 2 12:48:32 PST 2022
Author: Nathan Sidwell
Date: 2022-01-02T15:48:16-05:00
New Revision: b50fea47b6c454581fce89af359f3afe5154986c
URL: https://github.com/llvm/llvm-project/commit/b50fea47b6c454581fce89af359f3afe5154986c
DIFF: https://github.com/llvm/llvm-project/commit/b50fea47b6c454581fce89af359f3afe5154986c.diff
LOG: [clang] Allow using std::coroutine_traits in std::experimental
This is that diff I was aiming for. When transitioning code from
coroutines-ts to c++20, it can be useful to add a using declaration to
std::experimental pointing to std::coroutine_traits. This permits
that use by checking whether lookup in std::experimentl finds a
different decl to lookup in std. You still get a warning about
std::experimental::coroutine_traits being a thing, just not an error.
Reviewed By: ChuanqiXu
Differential Revision: https://reviews.llvm.org/D115943
Added:
clang/test/SemaCXX/coroutine-mixed3-exp-namespace.cpp
clang/test/SemaCXX/coroutine-mixed4-exp-namespace.cpp
Modified:
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaCoroutine.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 8ef9195944d56..afc63d4806272 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11047,7 +11047,7 @@ def warn_deprecated_coroutine_namespace : Warning<
"use std::%0 instead">,
InGroup<DeprecatedExperimentalCoroutine>;
def err_mixed_use_std_and_experimental_namespace_for_coroutine : Error<
- "mixed use of std and std::experimental namespaces for "
+ "conflicting mixed use of std and std::experimental namespaces for "
"coroutine components">;
def err_implicit_coroutine_std_nothrow_type_not_found : Error<
"std::nothrow was not found; include <new> before defining a coroutine which "
diff --git a/clang/lib/Sema/SemaCoroutine.cpp b/clang/lib/Sema/SemaCoroutine.cpp
index 3a6d9f0b9f265..f5f78c02e3701 100644
--- a/clang/lib/Sema/SemaCoroutine.cpp
+++ b/clang/lib/Sema/SemaCoroutine.cpp
@@ -1761,8 +1761,9 @@ ClassTemplateDecl *Sema::lookupCoroutineTraits(SourceLocation KwLoc,
auto *Found = *ResExp.begin();
Diag(Found->getLocation(), diag::note_entity_declared_at) << Found;
- if (InStd) {
- // Also found in std
+ if (InStd &&
+ StdCoroutineTraitsCache != ResExp.getAsSingle<ClassTemplateDecl>()) {
+ // Also found something
diff erent in std
Diag(KwLoc,
diag::err_mixed_use_std_and_experimental_namespace_for_coroutine);
Diag(StdCoroutineTraitsCache->getLocation(),
diff --git a/clang/test/SemaCXX/coroutine-mixed3-exp-namespace.cpp b/clang/test/SemaCXX/coroutine-mixed3-exp-namespace.cpp
new file mode 100644
index 0000000000000..533f9d78e2784
--- /dev/null
+++ b/clang/test/SemaCXX/coroutine-mixed3-exp-namespace.cpp
@@ -0,0 +1,30 @@
+// RUN: %clang_cc1 -verify -std=c++20 -fsyntax-only %s
+
+#include "Inputs/std-coroutine.h"
+
+namespace std::experimental {
+using std::coroutine_handle;
+using std::coroutine_traits; // expected-note{{declared here}}
+} // namespace std::experimental
+
+struct my_awaitable {
+ bool await_ready() noexcept;
+ void await_suspend(std::coroutine_handle<> coro) noexcept;
+ void await_resume() noexcept;
+};
+
+struct promise_void {
+ void get_return_object();
+ my_awaitable initial_suspend();
+ my_awaitable final_suspend() noexcept;
+ void return_void();
+ void unhandled_exception();
+};
+
+template <>
+struct std::coroutine_traits<void> { using promise_type = promise_void; };
+
+void test() {
+ co_return;
+ // expected-warning at -1{{support for std::experimental::coroutine_traits will be removed}}
+}
diff --git a/clang/test/SemaCXX/coroutine-mixed4-exp-namespace.cpp b/clang/test/SemaCXX/coroutine-mixed4-exp-namespace.cpp
new file mode 100644
index 0000000000000..715282dd2df83
--- /dev/null
+++ b/clang/test/SemaCXX/coroutine-mixed4-exp-namespace.cpp
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -verify -std=c++20 -fsyntax-only %s
+
+#include "Inputs/std-coroutine.h"
+
+namespace std::experimental {
+// expected-note at +1{{declared here}}
+template <typename T> using coroutine_traits = std::coroutine_traits<T>;
+using std::coroutine_handle;
+} // namespace std::experimental
+
+struct my_awaitable {
+ bool await_ready() noexcept;
+ void await_suspend(std::experimental::coroutine_handle<> coro) noexcept;
+ void await_resume() noexcept;
+};
+
+struct promise_void {
+ void get_return_object();
+ my_awaitable initial_suspend();
+ my_awaitable final_suspend() noexcept;
+ void return_void();
+ void unhandled_exception();
+};
+
+template <>
+struct std::coroutine_traits<void> { using promise_type = promise_void; };
+
+void test() {
+ co_return; // expected-error {{mixed use of std and std::experimental namespaces for coroutine components}}
+ // expected-warning at -1{{support for std::experimental::coroutine_traits will be removed}}
+ // expected-note at Inputs/std-coroutine.h:8 {{'coroutine_traits' declared here}}
+}
More information about the cfe-commits
mailing list