[PATCH] D99517: Implemented [[clang::musttail]] attribute for guaranteed tail calls.

Richard Smith - zygoloid via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 13 16:56:28 PDT 2021


rsmith 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.
----------------
haberman wrote:
> 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
> ```
Ah, right, while the callee will always have a non-null type, that type might not be a pointer type.

I think what we're missing here is a check for a dependent callee; checking for a dependent context isn't enough to check for error-dependent constructs. Probably the simplest thing would be to change the `isDependentContext()` checks to also check if the return expression `isInstantiationDependent()`. (That would only help with the error-dependent cases for now, but we'd also need that extra check in the future if anything like http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2277r0.html goes forward, allowing dependent constructs in non-dependent contexts, especially in combination with http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1306r1.pdf.)


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