[coroutines] Fix fallthrough warning on try/catch
authorBrian Gesiak <modocache@gmail.com>
Sat, 3 Nov 2018 22:35:17 +0000 (22:35 +0000)
committerBrian Gesiak <modocache@gmail.com>
Sat, 3 Nov 2018 22:35:17 +0000 (22:35 +0000)
commita87ecf6c7f68ae1797d33d9c451d9fd78cf431b8
tree7331c667727c2a2df8b08cf070b7082f866bfe50
parent7aed9e600b42427292467d408235c367d43a1755
[coroutines] Fix fallthrough warning on try/catch

Summary:
The test case added in this diff would incorrectly warn that control
flow may fall through without returning. Here's a standalone example:
https://godbolt.org/z/dCwXEi

The same program, but using `return` instead of `co_return`, does not
produce a warning: https://godbolt.org/z/mVldqQ

The issue was in how Clang analysis would structure its representation
of the control-flow graph. Specifically, when constructing the CFG,
`CFGBuilder::Visit` had special handling of a `ReturnStmt`, in which it
would place object destructors in the same CFG block as a `return` statement,
immediately after it. Doing so would allow the logic in
`lib/Sema/AnalysisBasedWarning.cpp` `CheckFallThrough` to work properly in the
program that used `return`, correctly determining that no "plain edges" preceded
the exit block of the function.

Because a `co_return` statement would not enjoy the same treatment when
it was being built into the control-flow graph, object destructors
would not be placed in the same CFG block as the `co_return`, thus
resulting in a "plain edge" preceding the exit block of the function,
and so the warning logic would be triggered.

Add special casing for `co_return` to Clang analysis, thereby
remedying the mistaken warning.

Test Plan: `check-clang`

Reviewers: GorNishanov, tks2103, rsmith

Reviewed By: GorNishanov

Subscribers: EricWF, lewissbaker, cfe-commits

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

llvm-svn: 346074
clang/lib/Analysis/CFG.cpp
clang/test/SemaCXX/coreturn-eh.cpp [new file with mode: 0644]