A reduced test case: struct a { a(const char *); }; template <typename b> void c() { a d(b::e ? "" : ""); }
On Thu, Oct 19, 2017 at 5:57 PM, Benjamin Kramer <benny....@gmail.com> wrote: > We should check VD->getInit()->isValueDependent() before we call > evaluateValue. I wasn't able to come up with a test case that triggers > the assert though :( > > On Thu, Oct 19, 2017 at 5:45 PM, Alexander Kornienko <ale...@google.com> > wrote: > > > > > > 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