From 5bc9d2f5ed4c39a7cad74db34e2bb125e012fa60 Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Tue, 4 Feb 2020 09:36:30 +0000 Subject: [PATCH] coroutines: Prevent repeated error messages for missing promise. If the user's coroutine return type omits the mandatory promise type then we will currently restate that error each time we see a coroutine keyword, which doesn't provide any new information. This suppresses all but the first instance in each coroutine. gcc/cp/ChangeLog: 2020-02-04 Iain Sandoe * coroutines.cc (find_promise_type): Delete unused forward declaration. (struct coroutine_info): Add a bool for no promise type error. (coro_promise_type_found_p): Only emit the error for a missing promise once in each affected coroutine. gcc/testsuite/ChangeLog: 2020-02-04 Iain Sandoe * g++.dg/coroutines/coro-missing-promise.C: New test. --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/coroutines.cc | 7 +++++-- gcc/testsuite/ChangeLog | 4 ++++ .../g++.dg/coroutines/coro-missing-promise.C | 20 +++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/coroutines/coro-missing-promise.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8b352134aa7..ab63ec7a0fe 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2020-02-04 Iain Sandoe + + * coroutines.cc (find_promise_type): Delete unused forward + declaration. + (struct coroutine_info): Add a bool for no promise type error. + (coro_promise_type_found_p): Only emit the error for a missing + promise once in each affected coroutine. + 2020-02-03 Jason Merrill PR c++/66477 diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc index 8a0ce384425..d5ff6750d2e 100644 --- a/gcc/cp/coroutines.cc +++ b/gcc/cp/coroutines.cc @@ -33,7 +33,6 @@ along with GCC; see the file COPYING3. If not see #include "gcc-rich-location.h" #include "hash-map.h" -static tree find_promise_type (tree); static bool coro_promise_type_found_p (tree, location_t); /* GCC C++ coroutines implementation. @@ -93,6 +92,7 @@ struct GTY((for_user)) coroutine_info function into a coroutine. */ /* Flags to avoid repeated errors for per-function issues. */ bool coro_ret_type_error_emitted; + bool coro_promise_error_emitted; }; struct coroutine_info_hasher : ggc_ptr_hash @@ -460,7 +460,10 @@ coro_promise_type_found_p (tree fndecl, location_t loc) /* If we don't find it, punt on the rest. */ if (coro_info->promise_type == NULL_TREE) { - error_at (loc, "unable to find the promise type for this coroutine"); + if (!coro_info->coro_promise_error_emitted) + error_at (loc, "unable to find the promise type for" + " this coroutine"); + coro_info->coro_promise_error_emitted = true; return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 06dba78e16f..8e245303974 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2020-02-04 Iain Sandoe + + * g++.dg/coroutines/coro-missing-promise.C: New test. + 2020-02-04 Richard Biener PR tree-optimization/91123 diff --git a/gcc/testsuite/g++.dg/coroutines/coro-missing-promise.C b/gcc/testsuite/g++.dg/coroutines/coro-missing-promise.C new file mode 100644 index 00000000000..3fc21a4e2ca --- /dev/null +++ b/gcc/testsuite/g++.dg/coroutines/coro-missing-promise.C @@ -0,0 +1,20 @@ +// { dg-additional-options "-fsyntax-only -w" } + +#include "coro.h" + +// Diagnose completely missing promise. + +// { dg-error {no type named 'promise_type' in 'struct NoPromiseHere'} "" { target *-*-* } 0 } + +struct NoPromiseHere { + coro::coroutine_handle<> handle; + NoPromiseHere () : handle (nullptr) {} + NoPromiseHere (coro::coroutine_handle<> handle) : handle (handle) {} +}; + +NoPromiseHere +bar () +{ + co_yield 22; // { dg-error {unable to find the promise type for this coroutine} } + co_return 0; +} -- 2.30.2