Page MenuHomePhabricator

[coroutines] Fix fallthrough warning on try/catch
ClosedPublic

Authored by modocache on Nov 3 2018, 12:01 PM.

Details

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

Diff Detail

Repository
rC Clang

Event Timeline

modocache created this revision.Nov 3 2018, 12:01 PM
This revision is now accepted and ready to land.Nov 3 2018, 3:03 PM

Great, thanks!

This revision was automatically updated to reflect the committed changes.