Author: d0k Date: Fri Oct 13 18:30:49 2017 New Revision: 315787 URL: http://llvm.org/viewvc/llvm-project?rev=315787&view=rev Log: [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 Modified: cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/SemaCXX/warn-unused-variables.cpp Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=315787&r1=315786&r2=315787&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Oct 13 18:30:49 2017 @@ -1723,7 +1723,8 @@ static bool ShouldDiagnoseUnusedDecl(con dyn_cast<CXXConstructExpr>(Init); if (Construct && !Construct->isElidable()) { CXXConstructorDecl *CD = Construct->getConstructor(); - if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>()) + if (!CD->isTrivial() && !RD->hasAttr<WarnUnusedAttr>() && + !VD->evaluateValue()) return false; } } Modified: cfe/trunk/test/SemaCXX/warn-unused-variables.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-variables.cpp?rev=315787&r1=315786&r2=315787&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/warn-unused-variables.cpp (original) +++ cfe/trunk/test/SemaCXX/warn-unused-variables.cpp Fri Oct 13 18:30:49 2017 @@ -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<typename T> void f() { T t; t = 17; @@ -194,3 +195,35 @@ void test() { } } + +#if __cplusplus >= 201103L +namespace with_constexpr { +template <typename T> +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<int> gl1; // expected-warning {{unused variable 'gl1'}} +static Literal<int> gl2(1); // expected-warning {{unused variable 'gl2'}} +static const Literal<int> gl3(0); // expected-warning {{unused variable 'gl3'}} + +template <typename T> +void test(int i) { + Literal<int> l1; // expected-warning {{unused variable 'l1'}} + Literal<int> l2(42); // expected-warning {{unused variable 'l2'}} + Literal<int> l3(i); // no-warning + Literal<T> l4(0); // no-warning + NoLiteral nl1; // no-warning + NoLiteral nl2(42); // no-warning +} +} +#endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits