Given the following test program:
class C { public: int A(int a, int& b); }; int C::A(const int a, int b) { return a * b; }
Clang would produce an error message that correctly diagnosed the
redeclaration of C::A to not match the original declaration (the
parameters to the two declarations do not match -- the original takes an
int & as its 2nd parameter, but the redeclaration takes an int). However,
it also produced a note diagnostic that inaccurately pointed to the
first parameter, claiming that const int in the redeclaration did not
match the unqualified int in the original. The diagnostic is
misleading because it has nothing to do with why the program does not
compile.
The logic for checking for a function overload, in
Sema::FunctionParamTypesAreEqual, discards cv-qualifiers before
checking whether the types are equal. Do the same when producing the
overload diagnostic.
I see this is what Sema::FunctionParamTypesAreEqual does, but maybe both places should use hasSameUnqualifiedType?