Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:36:20

0001 //===--- IntegralLiteralExpressionMatcher.h - clang-tidy ------------------===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 
0009 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H
0010 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_INTEGRAL_LITERAL_EXPRESSION_MATCHER_H
0011 
0012 #include <clang/Lex/Token.h>
0013 #include <llvm/ADT/ArrayRef.h>
0014 
0015 namespace clang::tidy::modernize {
0016 
0017 enum class LiteralSize {
0018   Unknown = 0,
0019   Int,
0020   UnsignedInt,
0021   Long,
0022   UnsignedLong,
0023   LongLong,
0024   UnsignedLongLong
0025 };
0026 
0027 // Parses an array of tokens and returns true if they conform to the rules of
0028 // C++ for whole expressions involving integral literals.  Follows the operator
0029 // precedence rules of C++.  Optionally exclude comma operator expressions.
0030 class IntegralLiteralExpressionMatcher {
0031 public:
0032   IntegralLiteralExpressionMatcher(ArrayRef<Token> Tokens, bool CommaAllowed)
0033       : Current(Tokens.begin()), End(Tokens.end()), CommaAllowed(CommaAllowed) {
0034   }
0035 
0036   bool match();
0037   LiteralSize largestLiteralSize() const;
0038 
0039 private:
0040   bool advance();
0041   bool consume(tok::TokenKind Kind);
0042   template <typename NonTerminalFunctor, typename IsKindFunctor>
0043   bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal,
0044                               const IsKindFunctor &IsKind);
0045   template <tok::TokenKind Kind, typename NonTerminalFunctor>
0046   bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal);
0047   template <tok::TokenKind K1, tok::TokenKind K2, tok::TokenKind... Ks,
0048             typename NonTerminalFunctor>
0049   bool nonTerminalChainedExpr(const NonTerminalFunctor &NonTerminal);
0050 
0051   bool unaryOperator();
0052   bool unaryExpr();
0053   bool multiplicativeExpr();
0054   bool additiveExpr();
0055   bool shiftExpr();
0056   bool compareExpr();
0057   bool relationalExpr();
0058   bool equalityExpr();
0059   bool andExpr();
0060   bool exclusiveOrExpr();
0061   bool inclusiveOrExpr();
0062   bool logicalAndExpr();
0063   bool logicalOrExpr();
0064   bool conditionalExpr();
0065   bool commaExpr();
0066   bool expr();
0067 
0068   ArrayRef<Token>::iterator Current;
0069   ArrayRef<Token>::iterator End;
0070   LiteralSize LargestSize{LiteralSize::Unknown};
0071   bool CommaAllowed;
0072 };
0073 
0074 } // namespace clang::tidy::modernize
0075 
0076 #endif