From 819ec01ce369929bf1927d2185fd561ee8e32cde Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sat, 14 Oct 2017 01:30:49 +0000 Subject: [PATCH] [Sema] Warn about unused variables if we can constant evaluate the initializer. If the variable construction can be constant evaluated it doesn't have side effects, so removing it is always safe. We only try to evaluate variables that are unused, there should be no impact on compile time. Differential Revision: https://reviews.llvm.org/D38678 llvm-svn: 315787 --- clang/lib/Sema/SemaDecl.cpp | 3 +- clang/test/SemaCXX/warn-unused-variables.cpp | 33 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 31abdfa3f6c0..e6f3aeae9617 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1723,7 +1723,8 @@ static bool ShouldDiagnoseUnusedDecl(const NamedDecl *D) { dyn_cast(Init); if (Construct && !Construct->isElidable()) { CXXConstructorDecl *CD = Construct->getConstructor(); - if (!CD->isTrivial() && !RD->hasAttr()) + if (!CD->isTrivial() && !RD->hasAttr() && + !VD->evaluateValue()) return false; } } diff --git a/clang/test/SemaCXX/warn-unused-variables.cpp b/clang/test/SemaCXX/warn-unused-variables.cpp index d7be785b35a6..0974cf5a61d6 100644 --- a/clang/test/SemaCXX/warn-unused-variables.cpp +++ b/clang/test/SemaCXX/warn-unused-variables.cpp @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wunused-variable -Wunused-label -Wno-c++1y-extensions -verify -std=c++11 %s template void f() { T t; t = 17; @@ -194,3 +195,35 @@ void test() { } } + +#if __cplusplus >= 201103L +namespace with_constexpr { +template +struct Literal { + T i; + Literal() = default; + constexpr Literal(T i) : i(i) {} +}; + +struct NoLiteral { + int i; + NoLiteral() = default; + constexpr NoLiteral(int i) : i(i) {} + ~NoLiteral() {} +}; + +static Literal gl1; // expected-warning {{unused variable 'gl1'}} +static Literal gl2(1); // expected-warning {{unused variable 'gl2'}} +static const Literal gl3(0); // expected-warning {{unused variable 'gl3'}} + +template +void test(int i) { + Literal l1; // expected-warning {{unused variable 'l1'}} + Literal l2(42); // expected-warning {{unused variable 'l2'}} + Literal l3(i); // no-warning + Literal l4(0); // no-warning + NoLiteral nl1; // no-warning + NoLiteral nl2(42); // no-warning +} +} +#endif