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