baloghadamsoftware added a comment.

In D77229#2007038 <https://reviews.llvm.org/D77229#2007038>, 
@baloghadamsoftware wrote:

> As I wrote, I debugged and analyzed it and I am facing a problem for which I 
> need help. Operator calls are very poorly implemented in the AST.


Yes, indeed very poorly. A C++ operator call is either implemented as 
`CXXOperatorCall` or `CXXMethodCall` randomly. In the former case the `this` 
parameter is explicit at the beginning, in the latter case it is implicit. I 
managed to solve it using this piece of code:

  const auto *Call = cast<Expr>(CallSite);
  unsigned Index = PVD->getFunctionScopeIndex();
  // For `CallExpr` of C++ member operators we must shift the index by 1
  if (isa<CXXOperatorCallExpr>(Call)) {
    if (const auto *CMD = dyn_cast<CXXMethodDecl>(SFC->getDecl())) {
      if (CMD->isOverloadedOperator())
        ++Index;
    }
  }

But this is not the only problem with indices. I have no solution for the 
following call (is it really a call?) resulting in an assertion because 
overindexing in `nullability.mm`:

  Dummy *_Nonnull (^myblock)(void) = ^Dummy *_Nonnull(void) {

Even if I try to get the `FunctionDecl` it still says that it has `0` 
parameters, exactly what `CallExpr` says, but we //have// a parameter here with 
index of `0`. How can it be? How should I handle this strange case? I only have 
very basic //Objective-C// knowledge.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D77229/new/

https://reviews.llvm.org/D77229



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to