[coroutines][PR41909] Don't build dependent coroutine statements for generic lambda
authorBrian Gesiak <modocache@gmail.com>
Mon, 3 Jun 2019 00:47:32 +0000 (00:47 +0000)
committerBrian Gesiak <modocache@gmail.com>
Mon, 3 Jun 2019 00:47:32 +0000 (00:47 +0000)
commit38f11825d18eab5bc140f891dc4c024e45283a90
treec8a6dddb19f17d0a00b6645c05a03c8695507e82
parentc3236cd200ae19618ab75a7cc6c71472512730e5
[coroutines][PR41909] Don't build dependent coroutine statements for generic lambda

Summary:
https://bugs.llvm.org/show_bug.cgi?id=41909 describes an issue in which
a generic lambda that takes a dependent argument `auto set` causes the
template instantiation machinery for coroutine body statements to crash
with an ICE. The issue is two-fold:

1. The paths taken by the template instantiator contain several asserts
   that the coroutine promise must not have a dependent type.
2. The template instantiator unconditionally builds corotuine statements
   that depend on the promise type, which cannot be dependent.

To work around the issue, prevent the template instantiator from building
dependent coroutine statements if the coroutine promise type is dependent.
Since we only expect this to occur in the case of a generic lambda, limit
the workaround behavior to just that case.

Reviewers: GorNishanov, EricWF, lewissbaker, tks2103

Reviewed By: GorNishanov

Subscribers: cfe-commits

Tags: #clang

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

llvm-svn: 362348
clang/lib/Sema/TreeTransform.h
clang/test/SemaCXX/coroutines.cpp