diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 1cf87e45a29931..c2571245201375 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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; } } } diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp index 97634ac43c57e7..2634fb1ec0f7f1 100644 --- a/clang/test/SemaCXX/warn-unused-variables.cpp +++ b/clang/test/SemaCXX/warn-unused-variables.cpp @@ -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 +void foo(T &t) { + S s{t}; +} +} #endif