Commit 5bc9d2f5 by Iain Sandoe

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  <iain@sandoe.co.uk>

	* 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  <iain@sandoe.co.uk>

	* g++.dg/coroutines/coro-missing-promise.C: New test.
parent 5f0653a8
2020-02-04 Iain Sandoe <iain@sandoe.co.uk>
* 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 <jason@redhat.com> 2020-02-03 Jason Merrill <jason@redhat.com>
PR c++/66477 PR c++/66477
......
...@@ -33,7 +33,6 @@ along with GCC; see the file COPYING3. If not see ...@@ -33,7 +33,6 @@ along with GCC; see the file COPYING3. If not see
#include "gcc-rich-location.h" #include "gcc-rich-location.h"
#include "hash-map.h" #include "hash-map.h"
static tree find_promise_type (tree);
static bool coro_promise_type_found_p (tree, location_t); static bool coro_promise_type_found_p (tree, location_t);
/* GCC C++ coroutines implementation. /* GCC C++ coroutines implementation.
...@@ -93,6 +92,7 @@ struct GTY((for_user)) coroutine_info ...@@ -93,6 +92,7 @@ struct GTY((for_user)) coroutine_info
function into a coroutine. */ function into a coroutine. */
/* Flags to avoid repeated errors for per-function issues. */ /* Flags to avoid repeated errors for per-function issues. */
bool coro_ret_type_error_emitted; bool coro_ret_type_error_emitted;
bool coro_promise_error_emitted;
}; };
struct coroutine_info_hasher : ggc_ptr_hash<coroutine_info> struct coroutine_info_hasher : ggc_ptr_hash<coroutine_info>
...@@ -460,7 +460,10 @@ coro_promise_type_found_p (tree fndecl, location_t loc) ...@@ -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 we don't find it, punt on the rest. */
if (coro_info->promise_type == NULL_TREE) 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; return false;
} }
......
2020-02-04 Iain Sandoe <iain@sandoe.co.uk>
* g++.dg/coroutines/coro-missing-promise.C: New test.
2020-02-04 Richard Biener <rguenther@suse.de> 2020-02-04 Richard Biener <rguenther@suse.de>
PR tree-optimization/91123 PR tree-optimization/91123
......
// { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment