From f7613d53619d11f46fb07ddb0ea90c9fb0cad027 Mon Sep 17 00:00:00 2001 From: Anders Carlsson Date: Sat, 7 Nov 2009 07:26:56 +0000 Subject: [PATCH] Don't treat variables with non-trivial ctors or dtors as unused. Fixes PR5407. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86352 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 18 ++++++++++++++++-- test/SemaCXX/warn-unused-variables.cpp | 8 ++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index df7be10223..8e1a19cbe5 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -385,8 +385,22 @@ bool Sema::isDeclInScope(NamedDecl *&D, DeclContext *Ctx, Scope *S) { } static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) { - return (!D->isUsed() && !D->hasAttr() && isa(D) && - !isa(D) && !isa(D) && + if (D->isUsed() || D->hasAttr()) + return false; + + if (const ValueDecl *VD = dyn_cast(D)) { + if (const RecordType *RT = VD->getType()->getAs()) { + if (const CXXRecordDecl *RD = dyn_cast(RT->getDecl())) { + if (!RD->hasTrivialConstructor()) + return false; + if (!RD->hasTrivialDestructor()) + return false; + } + } + } + + return (isa(D) && !isa(D) && + !isa(D) && D->getDeclContext()->isFunctionOrMethod()); } diff --git a/test/SemaCXX/warn-unused-variables.cpp b/test/SemaCXX/warn-unused-variables.cpp index d8b9a00ad6..001048910c 100644 --- a/test/SemaCXX/warn-unused-variables.cpp +++ b/test/SemaCXX/warn-unused-variables.cpp @@ -4,3 +4,11 @@ template void f() { T t; t = 17; } + +struct A { A(); }; +struct B { ~B(); }; + +void f() { + A a; + B b; +} \ No newline at end of file -- 2.50.1