[coroutines] Fix application of NRVO to Coroutine "Gro" or return object.

Authored by EricWF on Jan 29 2018, 3:52 PM.


[coroutines] Fix application of NRVO to Coroutine "Gro" or return object.

Fix NRVO for Gro variable.

Previously, we only marked the GRO declaration as an NRVO variable
when its QualType and the function return's QualType matched exactly
(using operator==). However, this was incorrect for two reasons:

  1. We were marking non-class types, such as ints, as being NRVO variables.
  1. We failed to handle cases where the canonical types were the same, but the actual QualType objects were different. For example, if one was represented by a typedef. (Example: https://godbolt.org/g/3UFgsL)

This patch fixes these bugs by marking the Gro variable as supporting NRVO only
when BuildReturnStmt marks the Gro variable as a coroutine candidate.

Reviewers: rsmith, GorNishanov, nicholas

Reviewed By: GorNishanov

Subscribers: majnemer, cfe-commits

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

llvm-svn: 323712