2016-10-17 16:33:59 +08:00
|
|
|
//===---------- ASTUtils.h - clang-tidy -----------------------------------===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
2016-10-17 16:33:59 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ASTUTILS_H
|
|
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ASTUTILS_H
|
|
|
|
|
|
|
|
#include "clang/AST/AST.h"
|
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace tidy {
|
|
|
|
namespace utils {
|
|
|
|
// Returns the (closest) Function declaration surrounding |Statement| or NULL.
|
|
|
|
const FunctionDecl *getSurroundingFunction(ASTContext &Context,
|
|
|
|
const Stmt &Statement);
|
2017-04-24 22:57:09 +08:00
|
|
|
// Determine whether Expr is a Binary or Ternary expression.
|
|
|
|
bool IsBinaryOrTernary(const Expr *E);
|
2017-07-13 01:43:36 +08:00
|
|
|
|
|
|
|
/// Checks whether a macro flag is present in the given argument. Only considers
|
|
|
|
/// cases of single match or match in a binary OR expression. For example,
|
|
|
|
/// <needed-flag> or <flag> | <needed-flag> | ...
|
|
|
|
bool exprHasBitFlagWithSpelling(const Expr *Flags, const SourceManager &SM,
|
|
|
|
const LangOptions &LangOpts,
|
|
|
|
StringRef FlagName);
|
[clang-tidy] Re-commit: Add new 'readability-uppercase-literal-suffix' check (CERT DCL16-C, MISRA C:2012, 7.3, MISRA C++:2008, 2-13-4)
Summary:
Detects when the integral literal or floating point (decimal or hexadecimal)
literal has non-uppercase suffix, and suggests to make the suffix uppercase,
with fix-it.
All valid combinations of suffixes are supported.
```
auto x = 1; // OK, no suffix.
auto x = 1u; // warning: integer literal suffix 'u' is not upper-case
auto x = 1U; // OK, suffix is uppercase.
...
```
This is a re-commit, the original was reverted by me in
rL345305 due to discovered bugs. (implicit code, template instantiation)
Tests were added, and the bugs were fixed.
I'm unable to find any further bugs, hopefully there aren't any..
References:
* [[ https://wiki.sei.cmu.edu/confluence/pages/viewpage.action?pageId=87152241 | CERT DCL16-C ]]
* MISRA C:2012, 7.3 - The lowercase character "l" shall not be used in a literal suffix
* MISRA C++:2008, 2-13-4 - Literal suffixes shall be upper case
Reviewers: JonasToth, aaron.ballman, alexfh, hokein, xazax.hun
Reviewed By: aaron.ballman
Subscribers: Eugene.Zelenko, mgorny, rnkovacs, cfe-commits
Tags: #clang-tools-extra
Differential Revision: https://reviews.llvm.org/D52670
llvm-svn: 345381
2018-10-26 21:09:27 +08:00
|
|
|
|
|
|
|
// Check if the range is entirely contained within a macro argument.
|
|
|
|
bool rangeIsEntirelyWithinMacroArgument(SourceRange Range,
|
|
|
|
const SourceManager *SM);
|
|
|
|
|
|
|
|
// Check if the range contains any locations from a macro expansion.
|
|
|
|
bool rangeContainsMacroExpansion(SourceRange Range, const SourceManager *SM);
|
|
|
|
|
|
|
|
// Can a fix-it be issued for this whole Range?
|
|
|
|
// FIXME: false-negative if the entire range is fully expanded from a macro.
|
|
|
|
bool rangeCanBeFixed(SourceRange Range, const SourceManager *SM);
|
|
|
|
|
2016-10-17 16:33:59 +08:00
|
|
|
} // namespace utils
|
|
|
|
} // namespace tidy
|
|
|
|
} // namespace clang
|
|
|
|
|
|
|
|
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_ASTUTILS_H
|