[PATCH] D99517: Implemented [[clang::musttail]] attribute for guaranteed tail calls.
Josh Haberman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 13 16:20:36 PDT 2021
haberman added inline comments.
================
Comment at: clang/lib/Sema/SemaStmt.cpp:711
+ if (CalleeQualType.isNull()) {
+ // The function callee is invalid and already triggered an error.
+ // Avoid compounding errors.
----------------
rsmith wrote:
> Even in invalid code we should never see a `CallExpr` whose callee has a null type; if `Sema` can't form an `Expr` that meets the normal expression invariants during error recovery, it doesn't build one at all. I think you can remove this `if`.
Without this if(), I crash on this test case. What do you think?
```
struct TestBadPMF {
int (TestBadPMF::*pmf)();
void BadPMF() {
[[clang::musttail]] return ((*this)->*pmf)(); // expected-error {{left hand operand to ->* must be a pointer to class compatible with the right hand operand, but is 'TestBadPMF'}}
}
};
```
Dump of `CalleeExpr` is:
```
RecoveryExpr 0x106671e8 '<dependent type>' contains-errors lvalue
|-ParenExpr 0x10667020 'struct TestBadPMF' lvalue
| `-UnaryOperator 0x10667008 'struct TestBadPMF' lvalue prefix '*' cannot overflow
| `-CXXThisExpr 0x10666ff8 'struct TestBadPMF *' this
`-MemberExpr 0x10667050 'int (struct TestBadPMF::*)(void)' lvalue ->pmf 0x10666ed0
`-CXXThisExpr 0x10667040 'struct TestBadPMF *' implicit this
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99517/new/
https://reviews.llvm.org/D99517
More information about the cfe-commits
mailing list