Suppress -Wwarn-unused-variables when we don't know the constructor

This warning is supposed to be suppressed when the
constructor/destructor are non-trivial, since it might be a RAII type.
However, if the type has a trivial destructor and the constructor hasn't
been resolved (since it is called with dependent arguments), we were
still warning.

This patch suppresses the warning if the type could possibly have a
be a non-trivial constructor call.  Note that this does not take the
arity of the constructors into consideration, so it might suppress
the warning in cases where it isn't possible to call a non-trivial
constructor.
This commit is contained in:
Erich Keane 2019-12-12 11:27:10 -08:00
parent 61368c8e98
commit 654c0daef7
2 changed files with 21 additions and 0 deletions

View File

@ -1805,6 +1805,13 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) {
(VD->getInit()->isValueDependent() || !VD->evaluateValue()))
return false;
}
// Suppress the warning if we don't know how this is constructed, and
// it could possibly be non-trivial constructor.
if (Init->isTypeDependent())
for (const CXXConstructorDecl *Ctor : RD->ctors())
if (!Ctor->isTrivial())
return false;
}
}
}

View File

@ -238,4 +238,18 @@ void c() {
a d(b::e ? "" : "");
}
}
// Ensure we don't warn on dependent constructor calls.
namespace dependent_ctor {
struct S {
S() = default;
S(const S &) = default;
S(int);
};
template <typename T>
void foo(T &t) {
S s{t};
}
}
#endif