[cfe-commits] [PATCH] Properly check for unused comparisons in arguments to function-like macros
Matt Beaumont-Gay
matthewbg at google.com
Thu Jan 3 13:28:39 PST 2013
I just realized this might seem a little weird, since we'll still give
a -Wunused-value warning for an unused comparison in a macro body.
But, my next patch is going to be "suppress all -Wunused-value
warnings from expressions in macro bodies" -- these are the biggest
source of false positives from -Wunused-value in Google's codebase.
On Wed, Jan 2, 2013 at 5:10 PM, Matt Beaumont-Gay <matthewbg at google.com> wrote:
> Hi chandlerc,
>
> Tweaking the implementation of -Wunused-value, I noticed a misbehavior of -Wunused-comparison: If the comparison is in a macro argument, we give up on emitting -Wunused-comparison, but fall through to emitting -Wunused-value. This patch fixes -Wunused-comparison to do the right thing. I also added a helper function 'isMacroBodyExpansion' to SourceManager (to go along with 'isMacroArgExpansion').
>
> http://llvm-reviews.chandlerc.com/D259
>
> Files:
> include/clang/Basic/SourceManager.h
> lib/Basic/SourceManager.cpp
> lib/Sema/SemaStmt.cpp
> test/Sema/unused-expr-system-header.c
>
> Index: include/clang/Basic/SourceManager.h
> ===================================================================
> --- include/clang/Basic/SourceManager.h
> +++ include/clang/Basic/SourceManager.h
> @@ -329,6 +329,11 @@
> SourceLocation::getFromRawEncoding(ExpansionLocEnd).isInvalid();
> }
>
> + bool isMacroBodyExpansion() const {
> + return getExpansionLocStart().isValid() &&
> + SourceLocation::getFromRawEncoding(ExpansionLocEnd).isValid();
> + }
> +
> bool isFunctionMacroExpansion() const {
> return getExpansionLocStart().isValid() &&
> getExpansionLocStart() != getExpansionLocEnd();
> @@ -1126,6 +1131,11 @@
> /// expanded.
> bool isMacroArgExpansion(SourceLocation Loc) const;
>
> + /// \brief Tests whether the given source location represents the expansion of
> + /// a macro body (as opposed to an expansion of the argument to a
> + /// function-like macro).
> + bool isMacroBodyExpansion(SourceLocation Loc) const;
> +
> /// \brief Returns true if \p Loc is inside the [\p Start, +\p Length)
> /// chunk of the source location address space.
> ///
> Index: lib/Basic/SourceManager.cpp
> ===================================================================
> --- lib/Basic/SourceManager.cpp
> +++ lib/Basic/SourceManager.cpp
> @@ -979,6 +979,15 @@
> return Expansion.isMacroArgExpansion();
> }
>
> +bool SourceManager::isMacroBodyExpansion(SourceLocation Loc) const {
> + if (!Loc.isMacroID()) return false;
> +
> + FileID FID = getFileID(Loc);
> + const SrcMgr::SLocEntry *E = &getSLocEntry(FID);
> + const SrcMgr::ExpansionInfo &Expansion = E->getExpansion();
> + return Expansion.isMacroBodyExpansion();
> +}
> +
>
> //===----------------------------------------------------------------------===//
> // Queries about the code at a SourceLocation.
> Index: lib/Sema/SemaStmt.cpp
> ===================================================================
> --- lib/Sema/SemaStmt.cpp
> +++ lib/Sema/SemaStmt.cpp
> @@ -125,7 +125,7 @@
>
> // Suppress warnings when the operator, suspicious as it may be, comes from
> // a macro expansion.
> - if (Loc.isMacroID())
> + if (S.SourceMgr.isMacroBodyExpansion(Loc))
> return false;
>
> S.Diag(Loc, diag::warn_unused_comparison)
> Index: test/Sema/unused-expr-system-header.c
> ===================================================================
> --- test/Sema/unused-expr-system-header.c
> +++ test/Sema/unused-expr-system-header.c
> @@ -3,8 +3,10 @@
> void f(int i1, int i2) {
> POSSIBLY_BAD_MACRO(5);
> STATEMENT_EXPR_MACRO(5);
> - COMMA_MACRO_1(i1 == i2, f(i1, i2)); // expected-warning {{expression result unused}}
> + COMMA_MACRO_1(i1 == i2, f(i1, i2)); // expected-warning {{comparison result unused}} \
> + // expected-note {{equality comparison}}
> COMMA_MACRO_2(i1 == i2, f(i1, i2));
> - COMMA_MACRO_3(i1 == i2, f(i1, i2)); // expected-warning {{expression result unused}}
> + COMMA_MACRO_3(i1 == i2, f(i1, i2)); // expected-warning {{comparison result unused}} \
> + // expected-note {{equality comparison}}
> COMMA_MACRO_4(i1 == i2, f(i1, i2));
> }
More information about the cfe-commits
mailing list