//===-- FileCheckImpl.h - Private FileCheck Interface ------------*- C++ -*-==// // // 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 // //===----------------------------------------------------------------------===// // // This file defines the private interfaces of FileCheck. Its purpose is to // allow unit testing of FileCheck and to separate the interface from the // implementation. It is only meant to be used by FileCheck. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_FILECHECK_FILECHECKIMPL_H #define LLVM_LIB_FILECHECK_FILECHECKIMPL_H #include "llvm/ADT/APInt.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/FileCheck/FileCheck.h" #include "llvm/Support/Error.h" #include "llvm/Support/SourceMgr.h" #include <map> #include <optional> #include <string> #include <vector> namespace llvm { //===----------------------------------------------------------------------===// // Numeric substitution handling code. //===----------------------------------------------------------------------===// /// Type representing the format an expression value should be textualized into /// for matching. Used to represent both explicit format specifiers as well as /// implicit format from using numeric variables. struct ExpressionFormat { … }; /// Class to represent an overflow error that might result when manipulating a /// value. class OverflowError : public ErrorInfo<OverflowError> { … }; /// Performs operation and \returns its result or an error in case of failure, /// such as if an overflow occurs. Expected<APInt> exprAdd(const APInt &Lhs, const APInt &Rhs, bool &Overflow); Expected<APInt> exprSub(const APInt &Lhs, const APInt &Rhs, bool &Overflow); Expected<APInt> exprMul(const APInt &Lhs, const APInt &Rhs, bool &Overflow); Expected<APInt> exprDiv(const APInt &Lhs, const APInt &Rhs, bool &Overflow); Expected<APInt> exprMax(const APInt &Lhs, const APInt &Rhs, bool &Overflow); Expected<APInt> exprMin(const APInt &Lhs, const APInt &Rhs, bool &Overflow); /// Base class representing the AST of a given expression. class ExpressionAST { … }; /// Class representing an unsigned literal in the AST of an expression. class ExpressionLiteral : public ExpressionAST { … }; /// Class to represent an undefined variable error, which quotes that /// variable's name when printed. class UndefVarError : public ErrorInfo<UndefVarError> { … }; /// Class representing an expression and its matching format. class Expression { … }; /// Class representing a numeric variable and its associated current value. class NumericVariable { … }; /// Class representing the use of a numeric variable in the AST of an /// expression. class NumericVariableUse : public ExpressionAST { … }; /// Type of functions evaluating a given binary operation. binop_eval_t; /// Class representing a single binary operation in the AST of an expression. class BinaryOperation : public ExpressionAST { … }; class FileCheckPatternContext; /// Class representing a substitution to perform in the RegExStr string. class Substitution { … }; class StringSubstitution : public Substitution { … }; class NumericSubstitution : public Substitution { … }; //===----------------------------------------------------------------------===// // Pattern handling code. //===----------------------------------------------------------------------===// /// Class holding the Pattern global state, shared by all patterns: tables /// holding values of variables and whether they are defined or not at any /// given time in the matching process. class FileCheckPatternContext { … }; /// Class to represent an error holding a diagnostic with location information /// used when printing it. class ErrorDiagnostic : public ErrorInfo<ErrorDiagnostic> { … }; class NotFoundError : public ErrorInfo<NotFoundError> { … }; /// An error that has already been reported. /// /// This class is designed to support a function whose callers may need to know /// whether the function encountered and reported an error but never need to /// know the nature of that error. For example, the function has a return type /// of \c Error and always returns either \c ErrorReported or \c ErrorSuccess. /// That interface is similar to that of a function returning bool to indicate /// an error except, in the former case, (1) there is no confusion over polarity /// and (2) the caller must either check the result or explicitly ignore it with /// a call like \c consumeError. class ErrorReported final : public ErrorInfo<ErrorReported> { … }; class Pattern { … }; //===----------------------------------------------------------------------===// // Check Strings. //===----------------------------------------------------------------------===// /// A check that we found in the input file. struct FileCheckString { … }; } // namespace llvm #endif