[coroutines] Remove assert on CoroutineParameterMoves in Sema::buildCoroutineParamete...
authorBrian Gesiak <modocache@gmail.com>
Fri, 22 Nov 2019 16:25:19 +0000 (11:25 -0500)
committerBrian Gesiak <modocache@gmail.com>
Fri, 22 Nov 2019 16:39:13 +0000 (11:39 -0500)
Summary:
The assertion of CoroutineParameterMoves happens when build coroutine function with arguments  multiple time while fails to build promise type.

Fix: use return false instead.

Test Plan: check-clang

Reviewers: modocache, GorNishanov, rjmccall

Reviewed By: modocache

Subscribers: rjmccall, EricWF, cfe-commits

Tags: #clang

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

Patch by junparser (JunMa)!

clang/lib/Sema/SemaCoroutine.cpp
clang/test/SemaCXX/coroutines.cpp

index 7c125e9..271c4a1 100644 (file)
@@ -1527,8 +1527,8 @@ bool Sema::buildCoroutineParameterMoves(SourceLocation Loc) {
   auto *FD = cast<FunctionDecl>(CurContext);
 
   auto *ScopeInfo = getCurFunction();
-  assert(ScopeInfo->CoroutineParameterMoves.empty() &&
-         "Should not build parameter moves twice");
+  if (!ScopeInfo->CoroutineParameterMoves.empty())
+    return false;
 
   for (auto *PD : FD->parameters()) {
     if (PD->getType()->isDependentType())
index c8de7b0..677c6e6 100644 (file)
@@ -87,6 +87,11 @@ int no_promise_type() { // expected-error {{this function cannot be a coroutine:
   co_await a;
 }
 
+int no_promise_type_multiple_awaits(int) { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits<int, int>' has no member named 'promise_type'}}
+  co_await a;
+  co_await a;
+}
+
 template <>
 struct std::experimental::coroutine_traits<double, double> { typedef int promise_type; };
 double bad_promise_type(double) { // expected-error {{this function cannot be a coroutine: 'experimental::coroutine_traits<double, double>::promise_type' (aka 'int') is not a class}}