[basic.scope.scope] Is void adjustment and cv-qualifier adjustment applied when considering corresponding overload · Issue #577 · cplusplus/CWG (original) (raw)

Full name of submitter: Anoop Rana

Reference (section label): [basic.scope.scope]

Issue description:
Consider the following program for which we see compiler divergence but which seems to be well-formed as per current wording. Out of the 4 major compilers only gcc accept the code while all other three(clang, edg and msvc) rejects it.


struct A {
    void f(this void);
    void f();          //gcc: OK, EDG:Nope, Clang: Nope, MSVC:Nope
};

As per my understanding this is well-formed for the reason explained below.

From basic.scope.scope#3 and basic.scope.scope#4.4:

Two non-static member functions have corresponding object parameters if:

Two function or function template declarations declare corresponding overloads if:

Now let's apply this our example. First, here exactly one of the declarations is an implicit object member function with no ref-qualifier and the type of object parameter of void f(this void); is void which is different from the type of the object parameter of void f(); which is A&. That is, the former has void as its object parameter while the latter has A&.

Thus both basic.scope.scope#3 and basic.scope.scope#4.4 are violated and hence the program is well-formed. As of now gcc is the only compiler accepting this and other three compilers rejects this.

I think the rejecting compiler are incorrectly taking dcl.fct#4.sentence-4 into account which says:

A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list.

To my understanding this dcl.fct#4 cannot be used here in our program because the object parameters are compared directly without any void or cv-qualifier adjustments. I mean in basic.scope.scope#3 we're not comparing the parameter-type-list but instead comparing the object parameters directly(with reference removal).

So it should be made clear if, void adjustment, cv-qualifer adjustment are also supposed to be applied here along with reference removal. To my understanding dcl.fct#4 is not to be used here because basic.scope.scope#3 explicitly only mentioned reference removal.