Apply almost the same fix as D36390 but for templates
Details
Diff Detail
- Repository
- rC Clang
Event Timeline
Here's the file we use in our parameter info tests locally (that don't pass with the trunk of clang, but with your changes should now theoretically pass):
class B
{
public:
/// B ctor
B() {
priv();
spriv();
pub();
spub();
o();
this->priv();
this->spriv();
this->pub();
this->spub();
this->o();
B::priv();
B::spriv();
B::pub();
B::spub();
B::o();
this->B::priv();
this->B::spriv();
this->B::pub();
this->B::spub();
this->B::o();
}
/// a
void pub();
/// b
static void spub();
/// o
void o();
private:
/// c
void priv();
/// d
static void spriv();
};
class C : public B
{
public:
/// e
virtual void cpub() {
cpriv();
cspriv();
cpub();
cspub();
o();
o(1);
o(0.5f);
o(true);
this->cpriv();
this->cspriv();
this->cpub();
this->cspub();
this->o();
C::cpriv();
C::cspriv();
C::cpub();
C::cspub();
C::o();
C::o(1);
C::o(0.5f);
C::o(true);
this->C::cpriv();
this->C::cspriv();
this->C::cpub();
this->C::cspub();
this->C::o();
this->C::o(1);
this->C::o(0.5f);
this->C::o(true);
// base calls
pub();
spub();
this->pub();
this->spub();
B::pub();
B::spub();
B::o();
this->B::pub();
this->B::spub();
this->B::o();
B();
// templates
tfoo<int>();
stfoo<float>();
dfoo<double>();
dfoo(3.5);
dfoo2(1);
sdfoo2(false);
this->tfoo<int>();
this->stfoo<float>();
this->dfoo<double>();
this->dfoo(3.5);
this->dfoo2(1);
this->sdfoo2(false);
C::stfoo<decltype(nullptr)>();
C::sdfoo2(true);
// templates without type arguments (potential deduction)
dfoo();
dfoo2();
sdfoo2();
this->dfoo();
this->dfoo2();
this->sdfoo2();
C::dfoo();
C::dfoo2();
C::sdfoo2();
this->C::dfoo();
this->C::dfoo2();
this->C::sdfoo2();
// other special cases
(B::pub)();
(C::pub)();
(B::o)();
(C::o)();
}
/// f
static void cspub();
/// o override
void o();
/// overload0
void o(int);
/// overload1
void o(float);
private:
/// g
void cpriv();
/// h
static void cspriv();
/// simple template
template<typename T> void tfoo();
/// simple static template
template<typename T> static void stfoo();
/// template with default param
template<typename T> void dfoo(int x = 99-22);
/// template with deduced param
template<typename T> void dfoo(T x);
/// template with deduced param and default param
template<typename T> void dfoo2(T x = 0);
/// static template with deduced param and default param
template<typename T> static inline void sdfoo2(T x = 0) {
};Thanks for the feedback :) I will return to this one and address comments a little bit later.
| lib/Sema/SemaOverload.cpp | ||
|---|---|---|
| 6376 | IsTemplate seems redundant. You could use FunTmpl in the conditions below I think? This avoids maintaining two state variables. | |
| lib/Sema/SemaOverload.cpp | ||
|---|---|---|
| 6376 | I think bool value is more descriptive in this case | |
lgtm
| lib/Sema/SemaOverload.cpp | ||
|---|---|---|
| 6376 | I think FunImpl is clear enough. But up to you. Also this could be const bool IsTemplate = FunTmpl != nullptr; | |
IsTemplate seems redundant. You could use FunTmpl in the conditions below I think? This avoids maintaining two state variables.