================ @@ -1965,9 +1965,15 @@ bool Sema::buildCoroutineParameterMoves(SourceLocation Loc) { if (PD->getType()->isDependentType()) continue; + // Preserve the referenced state for unused parameter diagnostics. + bool DeclReferenced = PD->isReferenced(); ---------------- yuxuanchen1997 wrote:
`PD->isReferenced()` may be true. The order `Sema` processes things is based on how Parser is sending information to it. I can try to explain based on my limited understanding and corroborate with a test case. So please feel free to correct me if I am wrong. Let's take a look at this very simple coroutine. Suppose `task` is defined somewhere as a return object. ``` task foo(int a, int b) { a = a + 1; co_return; } ``` Sema is first asked to compile `foo` like a normal function. Decl `a` and `b` are processed normally. When we use `a` in the `a = a + 1` statement, references are setup. When the parser encounters `co_return`, it calls `Sema::ActOnCoreturn`. What `Sema::ActOnCoreturn` (and its siblings handling other `co_` family of statements) does is to call `Sema::ActOnCoroutineBodyStart`. It checks if clang is already treating `foo` as a coroutine. It will find out that, no. We are not compiling `foo` like a coroutine yet, let's perform necessary checks and establish this context. `buildCoroutineParameterMoves` is called as a result. At that time `a` already has references we need to carry along. Suppose that our function has subsequent `co_*` statements, `Sema` knows that we already established the context and doesn't build them again. The aforementioned `foo` coroutine will cause clang ICE if we `assert(!PD->isReferenced())` here. https://github.com/llvm/llvm-project/pull/70973 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits