aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorArsen Arsenović <arsen@aarsen.me>2024-07-25 16:13:24 +0200
committerArsen Arsenovic <arsen@gcc.gnu.org>2024-07-30 13:02:07 +0200
commit265aa32062167a5b299c2ffb616edce5997b64bf (patch)
tree83497c53a8ed05346f0eb4f5ae0f541a9c4f0a79 /gcc
parent136f364e26d9ad4f05e0005e480813cdc8f56c96 (diff)
downloadgcc-265aa32062167a5b299c2ffb616edce5997b64bf.zip
gcc-265aa32062167a5b299c2ffb616edce5997b64bf.tar.gz
gcc-265aa32062167a5b299c2ffb616edce5997b64bf.tar.bz2
c++: make source_location follow DECL_RAMP_FN
This fixes the value of current_function in compiler generated coroutine code. PR c++/110855 - std::source_location doesn't work with C++20 coroutine gcc/cp/ChangeLog: PR c++/110855 * cp-gimplify.cc (fold_builtin_source_location): Use the name of the DECL_RAMP_FN of the current function if present. gcc/testsuite/ChangeLog: PR c++/110855 * g++.dg/coroutines/pr110855.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/cp-gimplify.cc9
-rw-r--r--gcc/testsuite/g++.dg/coroutines/pr110855.C61
2 files changed, 69 insertions, 1 deletions
diff --git a/gcc/cp/cp-gimplify.cc b/gcc/cp/cp-gimplify.cc
index 6a5e4cf..b88c3b7 100644
--- a/gcc/cp/cp-gimplify.cc
+++ b/gcc/cp/cp-gimplify.cc
@@ -3933,7 +3933,14 @@ fold_builtin_source_location (const_tree t)
const char *name = "";
if (current_function_decl)
- name = cxx_printable_name (current_function_decl, 2);
+ {
+ /* If this is a coroutine, we should get the name of the user
+ function rather than the actor we generate. */
+ if (tree ramp = DECL_RAMP_FN (current_function_decl))
+ name = cxx_printable_name (ramp, 2);
+ else
+ name = cxx_printable_name (current_function_decl, 2);
+ }
val = build_string_literal (name);
}
diff --git a/gcc/testsuite/g++.dg/coroutines/pr110855.C b/gcc/testsuite/g++.dg/coroutines/pr110855.C
new file mode 100644
index 0000000..6b5c014
--- /dev/null
+++ b/gcc/testsuite/g++.dg/coroutines/pr110855.C
@@ -0,0 +1,61 @@
+// { dg-do run }
+// { dg-output {^} }
+// { dg-output {ReturnObject bar\(int, char, bool\)(\n|\r\n|\r)} }
+// { dg-output {ReturnObject bar\(int, char, bool\)(\n|\r\n|\r)} }
+// { dg-output {ReturnObject bar\(int, char, bool\)(\n|\r\n|\r)} }
+// { dg-output {ReturnObject bar\(int, char, bool\)(\n|\r\n|\r)} }
+// { dg-output {ReturnObject bar\(int, char, bool\)(\n|\r\n|\r)} }
+// { dg-output {$} }
+// https://gcc.gnu.org/PR110855
+#include <coroutine>
+#include <source_location>
+
+struct ReturnObject {
+ struct promise_type {
+ auto
+ initial_suspend(const std::source_location location =
+ std::source_location::current()) {
+ __builtin_puts (location.function_name ());
+ return std::suspend_never{};
+ }
+ auto
+ final_suspend(const std::source_location location =
+ std::source_location::current()) noexcept {
+ __builtin_puts (location.function_name ());
+ return std::suspend_never{};
+ }
+ auto
+ get_return_object(const std::source_location location =
+ std::source_location::current()) {
+ __builtin_puts (location.function_name ());
+ return ReturnObject{std::coroutine_handle<promise_type>::from_promise(*this)};
+ }
+ auto
+ unhandled_exception() { }
+ auto return_void(const std::source_location location =
+ std::source_location::current()) {
+ __builtin_puts (location.function_name ());
+ }
+ };
+ std::coroutine_handle<> handle;
+};
+
+struct awaitable : std::suspend_never
+{
+ void await_resume(const std::source_location location =
+ std::source_location::current())
+ {
+ __builtin_puts (location.function_name ());
+ }
+};
+
+ReturnObject
+bar(int, char, bool) {
+ co_await awaitable{};
+ co_return;
+}
+
+int
+main() {
+ bar(1, 'a', false);
+}