https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109381
Bug ID: 109381
Summary: Ambiguous member lookup with this-> accepted when it
should be rejected
Product: gcc
Version: unknown
Status: UNCONFIRMED
Keywords: accepts-invalid
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: arthur.j.odwyer at gmail dot com
Target Milestone: ---
// https://godbolt.org/z/ex97db8cT
template<class T>
struct B {
int f() { return 1; }
};
struct C {
int f() { return 2; }
};
template<class T>
struct D : B<T>, C {
int test() {
return this->f(); // GCC calls C::f; Clang and MSVC reject
}
};
int main() {
D<int> d;
return d.test();
}
This can't possibly be unreported yet, but a quick search failed to find any
bug filed on the subject. Sorry if this is a duplicate.
GCC correctly thinks that `return f();` should call `C::f` because `B<T>::f` is
not considered because `B<T>` is a dependent base class and we didn't say
`this->`.
But, GCC wrongly thinks that `return this->f();` should ALSO call `C::f`. Clang
and MSVC agree that it should be ambiguous, because now it IS looked up in both
phase 1 and phase 2, and an `f` is found in both base classes, so the lookup
should be considered ambiguous.
According to Godbolt, the issue was introduced somewhere between GCC 7.5 (OK)
and GCC 8.1 (buggy).