On Sat, Oct 14, 2017 at 5:59 PM, Benjamin Kramer via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: d0k > Date: Sat Oct 14 08:59:34 2017 > New Revision: 315811 > > URL: http://llvm.org/viewvc/llvm-project?rev=315811&view=rev > Log: > Re-land r315787, "[Sema] Warn about unused variables if we can constant > evaluate the initializer." > > The warnings in libc++ tests were fixed in the meantime. > > 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=315811&r1=315810&r2=315811&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat Oct 14 08:59:34 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()) > The evaluateValue call above causes an assertion failure on instantiation-dependent values: llvm/tools/clang/lib/AST/Decl.cpp:2196 in clang::APValue *clang::VarDecl::evaluateValue(SmallVectorImpl<clang::PartialDiagnosticAt> &) const: !Init->isValueDependent() I'm not sure why evaluateValue uses an assertion instead of outputting a note and returning nullptr, but the assertion can be avoided on the caller site as well. Working on a reduced test case... > 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=315811&r1=315810&r2=315811&view=diff > ============================================================ > ================== > --- cfe/trunk/test/SemaCXX/warn-unused-variables.cpp (original) > +++ cfe/trunk/test/SemaCXX/warn-unused-variables.cpp Sat Oct 14 08:59:34 > 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 >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits