Skip to content

Commit

Permalink
[coroutines] Improved diagnostics when unhandled_exception is missing…
Browse files Browse the repository at this point in the history
… in the promise_type

Summary: Now we helpfully provide a note pointing at the promise_type in question.

Reviewers: EricWF, GorNishanov

Reviewed By: GorNishanov

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D33481

llvm-svn: 303752
  • Loading branch information
GorNishanov committed May 24, 2017
1 parent cc8e849 commit 29ff638
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
8 changes: 4 additions & 4 deletions clang/lib/Sema/SemaCoroutine.cpp
Expand Up @@ -120,8 +120,7 @@ static QualType lookupPromiseType(Sema &S, const FunctionProtoType *FnType,
return PromiseType;
}

/// Look up the std::coroutine_traits<...>::promise_type for the given
/// function type.
/// Look up the std::experimental::coroutine_handle<PromiseType>.
static QualType lookupCoroutineHandleType(Sema &S, QualType PromiseType,
SourceLocation Loc) {
if (PromiseType.isNull())
Expand Down Expand Up @@ -729,8 +728,7 @@ void Sema::CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body) {
}

if (isa<CoroutineBodyStmt>(Body)) {
// FIXME(EricWF): Nothing todo. the body is already a transformed coroutine
// body statement.
// Nothing todo. the body is already a transformed coroutine body statement.
return;
}

Expand Down Expand Up @@ -1030,6 +1028,8 @@ bool CoroutineStmtBuilder::makeOnException() {
: diag::
warn_coroutine_promise_unhandled_exception_required_with_exceptions;
S.Diag(Loc, DiagID) << PromiseRecordDecl;
S.Diag(PromiseRecordDecl->getLocation(), diag::note_defined_here)
<< PromiseRecordDecl;
return !RequireUnhandledException;
}

Expand Down
4 changes: 4 additions & 0 deletions clang/test/SemaCXX/coroutine-unhandled_exception-warning.cpp
Expand Up @@ -16,7 +16,11 @@
using std::experimental::suspend_always;
using std::experimental::suspend_never;

#ifndef DISABLE_WARNING
struct promise_void { // expected-note {{defined here}}
#else
struct promise_void {
#endif
void get_return_object();
suspend_always initial_suspend();
suspend_always final_suspend();
Expand Down
2 changes: 1 addition & 1 deletion clang/test/SemaCXX/coroutines.cpp
Expand Up @@ -540,7 +540,7 @@ coro<T> bad_implicit_return_dependent(T) { // expected-error {{'bad_promise_6' d
}
template coro<bad_promise_6> bad_implicit_return_dependent(bad_promise_6); // expected-note {{in instantiation}}

struct bad_promise_7 {
struct bad_promise_7 { // expected-note 2 {{defined here}}
coro<bad_promise_7> get_return_object();
suspend_always initial_suspend();
suspend_always final_suspend();
Expand Down

0 comments on commit 29ff638

Please sign in to comment.