r190382 - Make -Wunused warning rules more consistent.
Eli Friedman
eli.friedman at gmail.com
Tue Sep 10 14:26:48 PDT 2013
Hopefully r190382 fixes most of the issues.
-Eli
On Tue, Sep 10, 2013 at 9:39 AM, NAKAMURA Takumi <geek4civic at gmail.com>wrote:
> Eli, could you work for making llvm/clang tree as clean to new-Wunused?
> I was not certain to prune lines according to new warnings.
>
>
> http://bb.pgr.jp/builders/clang-3stage-x86_64-linux/builds/2184/steps/build/logs/warnings%20%2874%29
>
> 2013/9/10 Eli Friedman <eli.friedman at gmail.com>:
> > Author: efriedma
> > Date: Mon Sep 9 22:05:56 2013
> > New Revision: 190382
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=190382&view=rev
> > Log:
> > Make -Wunused warning rules more consistent.
> >
> > This patch does a few different things.
> >
> > This patch improves unused var diags for const vars: we no longer
> > unconditionally suppress diagnostics for const vars, instead only
> suppressing
> > the diagnostic when the declaration appears to be useful.
> >
> > This patch also makes us more consistently use whether a
> variable/function
> > is declared in the main file to suppress diagnostics where appropriate.
> >
> > Fixes <rdar://problem/14907887>.
> >
> > Modified:
> > cfe/trunk/lib/Sema/Sema.cpp
> > cfe/trunk/lib/Sema/SemaDecl.cpp
> > cfe/trunk/test/SemaCXX/Inputs/warn-unused-variables.h
> > cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp
> >
> > Modified: cfe/trunk/lib/Sema/Sema.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=190382&r1=190381&r2=190382&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/Sema.cpp (original)
> > +++ cfe/trunk/lib/Sema/Sema.cpp Mon Sep 9 22:05:56 2013
> > @@ -749,11 +749,7 @@ void Sema::ActOnEndOfTranslationUnit() {
> > if (DiagD->isReferenced()) {
> > Diag(DiagD->getLocation(), diag::warn_unneeded_internal_decl)
> > << /*variable*/1 << DiagD->getDeclName();
> > - } else if (SourceMgr.isInMainFile(DiagD->getLocation())) {
> > - // If the declaration is in a header which is included into
> multiple
> > - // TUs, it will declare one variable per TU, and one of the
> other
> > - // variables may be used. So, only warn if the declaration is
> in the
> > - // main file.
> > + } else {
> > Diag(DiagD->getLocation(), diag::warn_unused_variable)
> > << DiagD->getDeclName();
> > }
> >
> > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=190382&r1=190381&r2=190382&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Sep 9 22:05:56 2013
> > @@ -1177,6 +1177,14 @@ bool Sema::mightHaveNonExternalLinkage(c
> > return !D->isExternallyVisible();
> > }
> >
> > +// FIXME: This needs to be refactored; some other isInMainFile users
> want
> > +// these semantics.
> > +static bool isMainFileLoc(const Sema &S, SourceLocation Loc) {
> > + if (S.TUKind != TU_Complete)
> > + return false;
> > + return S.SourceMgr.isInMainFile(Loc);
> > +}
> > +
> > bool Sema::ShouldWarnIfUnusedFileScopedDecl(const DeclaratorDecl *D)
> const {
> > assert(D);
> >
> > @@ -1196,12 +1204,9 @@ bool Sema::ShouldWarnIfUnusedFileScopedD
> > if (MD->isVirtual() || IsDisallowedCopyOrAssign(MD))
> > return false;
> > } else {
> > - // 'static inline' functions are used in headers; don't warn.
> > - // Make sure we get the storage class from the canonical
> declaration,
> > - // since otherwise we will get spurious warnings on specialized
> > - // static template functions.
> > - if (FD->getCanonicalDecl()->getStorageClass() == SC_Static &&
> > - FD->isInlineSpecified())
> > + // 'static inline' functions are defined in headers; don't warn.
> > + if (FD->isInlineSpecified() &&
> > + !isMainFileLoc(*this, FD->getLocation()))
> > return false;
> > }
> >
> > @@ -1209,21 +1214,26 @@ bool Sema::ShouldWarnIfUnusedFileScopedD
> > Context.DeclMustBeEmitted(FD))
> > return false;
> > } else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) {
> > - // Don't warn on variables of const-qualified or reference type,
> since their
> > - // values can be used even if though they're not odr-used, and
> because const
> > - // qualified variables can appear in headers in contexts where
> they're not
> > - // intended to be used.
> > - // FIXME: Use more principled rules for these exemptions.
> > - if (!VD->isFileVarDecl() ||
> > - VD->getType().isConstQualified() ||
> > - VD->getType()->isReferenceType() ||
> > - Context.DeclMustBeEmitted(VD))
> > + // Constants and utility variables are defined in headers with
> internal
> > + // linkage; don't warn. (Unlike functions, there isn't a
> convenient marker
> > + // like "inline".)
> > + if (!isMainFileLoc(*this, VD->getLocation()))
> > + return false;
> > +
> > + // If a variable usable in constant expressions is referenced,
> > + // don't warn if it isn't used: if the value of a variable is
> required
> > + // for the computation of a constant expression, it doesn't make
> sense to
> > + // warn even if the variable isn't odr-used. (isReferenced doesn't
> > + // precisely reflect that, but it's a decent approximation.)
> > + if (VD->isReferenced() &&
> VD->isUsableInConstantExpressions(Context))
> > + return false;
> > +
> > + if (Context.DeclMustBeEmitted(VD))
> > return false;
> >
> > if (VD->isStaticDataMember() &&
> > VD->getTemplateSpecializationKind() ==
> TSK_ImplicitInstantiation)
> > return false;
> > -
> > } else {
> > return false;
> > }
> >
> > Modified: cfe/trunk/test/SemaCXX/Inputs/warn-unused-variables.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/Inputs/warn-unused-variables.h?rev=190382&r1=190381&r2=190382&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/SemaCXX/Inputs/warn-unused-variables.h (original)
> > +++ cfe/trunk/test/SemaCXX/Inputs/warn-unused-variables.h Mon Sep 9
> 22:05:56 2013
> > @@ -7,5 +7,7 @@ class A {};
> >
> > class B {
> > static A a;
> > + static A b;
> > + static const int x = sizeof(b);
> > };
> > }
> >
> > Modified: cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp?rev=190382&r1=190381&r2=190382&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp (original)
> > +++ cfe/trunk/test/SemaCXX/warn-unused-filescoped.cpp Mon Sep 9
> 22:05:56 2013
> > @@ -1,6 +1,41 @@
> > // RUN: %clang_cc1 -fsyntax-only -verify -Wunused
> -Wunused-member-function -Wno-c++11-extensions -std=c++98 %s
> > // RUN: %clang_cc1 -fsyntax-only -verify -Wunused
> -Wunused-member-function -std=c++11 %s
> >
> > +#ifdef HEADER
> > +
> > +static void headerstatic() {} // expected-warning{{unused}}
> > +static inline void headerstaticinline() {}
> > +
> > +namespace {
> > + void headeranon() {} // expected-warning{{unused}}
> > + inline void headerinlineanon() {}
> > +}
> > +
> > +namespace test7
> > +{
> > + template<typename T>
> > + static inline void foo(T) { }
> > +
> > + // This should not emit an unused-function warning since it inherits
> > + // the static storage type from the base template.
> > + template<>
> > + inline void foo(int) { }
> > +
> > + // Partial specialization
> > + template<typename T, typename U>
> > + static inline void bar(T, U) { }
> > +
> > + template<typename U>
> > + inline void bar(int, U) { }
> > +
> > + template<>
> > + inline void bar(int, int) { }
> > +};
> > +
> > +#else
> > +#define HEADER
> > +#include "warn-unused-filescoped.cpp"
> > +
> > static void f1(); // expected-warning{{unused}}
> >
> > namespace {
> > @@ -37,8 +72,10 @@ namespace {
> >
> > void S::m3() { } // expected-warning{{unused}}
> >
> > -static inline void f4() { }
> > -const unsigned int cx = 0;
> > +static inline void f4() { } // expected-warning{{unused}}
> > +const unsigned int cx = 0; // expected-warning{{unused}}
> > +const unsigned int cy = 0;
> > +int f5() { return cy; }
> >
> > static int x1; // expected-warning{{unused}}
> >
> > @@ -98,7 +135,7 @@ namespace test5 {
> > // FIXME: We should produce warnings for both of these.
> > static const int m = n;
> > int x = sizeof(m);
> > - static const double d = 0.0;
> > + static const double d = 0.0; // expected-warning{{not needed and will
> not be emitted}}
> > int y = sizeof(d);
> > }
> >
> > @@ -133,27 +170,6 @@ namespace test6 {
> > };
> > }
> >
> > -namespace test7
> > -{
> > - template<typename T>
> > - static inline void foo(T) { }
> > -
> > - // This should not emit an unused-function warning since it inherits
> > - // the static storage type from the base template.
> > - template<>
> > - inline void foo(int) { }
> > -
> > - // Partial specialization
> > - template<typename T, typename U>
> > - static inline void bar(T, U) { }
> > -
> > - template<typename U>
> > - inline void bar(int, U) { }
> > -
> > - template<>
> > - inline void bar(int, int) { }
> > -};
> > -
> > namespace pr14776 {
> > namespace {
> > struct X {};
> > @@ -161,3 +177,5 @@ namespace pr14776 {
> > X a = X(); // expected-warning {{unused variable 'a'}}
> > auto b = X(); // expected-warning {{unused variable 'b'}}
> > }
> > +
> > +#endif
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130910/b1951527/attachment.html>
More information about the cfe-commits
mailing list