[PATCH] D142630: [clang][Interp] Implement virtual function calls
    Aaron Ballman via Phabricator via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Tue Feb  7 12:32:55 PST 2023
    
    
  
aaron.ballman added a comment.
In D142630#4110839 <https://reviews.llvm.org/D142630#4110839>, @tbaeder wrote:
> Hmm, this doesn't work if the callee is somewhere in between the path from the dynamic to the static type, e.g.
>
>   struct A {
>     virtual constexpr int foo() const { return 1; }
>   };
>   
>   struct B : A {
>     virtual constexpr int foo() const { return A::foo(); }
>   };
>   
>   constexpr B a;
>   static_assert(a.foo() == 1);
>
> For the `A::foo()` call, the type of the `This` pointer is `B`, so we will just select the `B::foo()` to call.
Ah, it sounds like we're not handling qualified calls properly. That makes me think of a few more test cases:
  struct A {
    virtual constexpr int foo() const { return 1; }
  };
  
  struct B : A {
    // Same behavior as your test case but with more baffling syntax. :-)
    virtual constexpr int foo() const { return this->A::foo(); }
  };
  
  constexpr B a;
  static_assert(a.foo() == 1);
or with shadowed member variables (not related to virtual functions directly, but is related to qualified lookup):
  struct A {
    virtual constexpr int foo() const { return 0; }
    int Val = 1;
  };
  
  struct B : A {
    virtual constexpr int foo() const { return A::Val; }
    int Val = 2;
  };
  
  constexpr B a;
  static_assert(a.foo() == 1);
note, the rules are different for constructors and destructors than they are for other functions, so similar test cases involving those would be a good idea as well (though perhaps in a separate patch).
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D142630/new/
https://reviews.llvm.org/D142630
    
    
More information about the cfe-commits
mailing list