diff options
author | Brian Gesiak <modocache@gmail.com> | 2018-11-03 22:35:17 +0000 |
---|---|---|
committer | Brian Gesiak <modocache@gmail.com> | 2018-11-03 22:35:17 +0000 |
commit | a87ecf6c7f68ae1797d33d9c451d9fd78cf431b8 (patch) | |
tree | 7331c667727c2a2df8b08cf070b7082f866bfe50 /libclc/r600/lib | |
parent | 7aed9e600b42427292467d408235c367d43a1755 (diff) | |
download | bcm5719-llvm-a87ecf6c7f68ae1797d33d9c451d9fd78cf431b8.tar.gz bcm5719-llvm-a87ecf6c7f68ae1797d33d9c451d9fd78cf431b8.zip |
[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
Diffstat (limited to 'libclc/r600/lib')
0 files changed, 0 insertions, 0 deletions