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

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

Reply via email to