r315811 - Re-land r315787, "[Sema] Warn about unused variables if we can constant evaluate the initializer."

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Thu Oct 19 11:37:59 PDT 2017


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.kra at 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 <alexfh at google.com>
> wrote:
> >
> >
> > On Sat, Oct 14, 2017 at 5:59 PM, Benjamin Kramer via cfe-commits
> > <cfe-commits at 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 at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
> >
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171019/b7fd88b5/attachment-0001.html>


More information about the cfe-commits mailing list