clang 22.0.0git
PPExpressions.cpp File Reference
#include "clang/Basic/IdentifierTable.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TokenKinds.h"
#include "clang/Lex/CodeCompletionHandler.h"
#include "clang/Lex/LexDiagnostic.h"
#include "clang/Lex/LiteralSupport.h"
#include "clang/Lex/MacroInfo.h"
#include "clang/Lex/PPCallbacks.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/PreprocessorOptions.h"
#include "clang/Lex/Token.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/SaveAndRestore.h"
#include <cassert>

Go to the source code of this file.

Classes

struct  DefinedTracker
 DefinedTracker - This struct is used while parsing expressions to keep track of whether !defined(X) has been seen. More...

Functions

static bool EvaluateDirectiveSubExpr (PPValue &LHS, unsigned MinPrec, Token &PeekTok, bool ValueLive, bool &IncludedUndefinedIds, Preprocessor &PP)
 EvaluateDirectiveSubExpr - Evaluate the subexpression whose first token is PeekTok, and whose precedence is PeekPrec.
static bool EvaluateDefined (PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP)
 EvaluateDefined - Process a 'defined(sym)' expression.
static bool EvaluateValue (PPValue &Result, Token &PeekTok, DefinedTracker &DT, bool ValueLive, Preprocessor &PP)
 EvaluateValue - Evaluate the token PeekTok (and any others needed) and return the computed value in Result.
static unsigned getPrecedence (tok::TokenKind Kind)
 getPrecedence - Return the precedence of the specified binary operator token.
static void diagnoseUnexpectedOperator (Preprocessor &PP, PPValue &LHS, Token &Tok)
static std::optional< CXXStandardLibraryVersionInfogetCXXStandardLibraryVersion (Preprocessor &PP, StringRef MacroName, CXXStandardLibraryVersionInfo::Library Lib)

Function Documentation

◆ diagnoseUnexpectedOperator()

void diagnoseUnexpectedOperator ( Preprocessor & PP,
PPValue & LHS,
Token & Tok )
static

Definition at line 576 of file PPExpressions.cpp.

References clang::Preprocessor::Diag(), and Tok.

Referenced by EvaluateDirectiveSubExpr().

◆ EvaluateDefined()

◆ EvaluateDirectiveSubExpr()

bool EvaluateDirectiveSubExpr ( PPValue & LHS,
unsigned MinPrec,
Token & PeekTok,
bool ValueLive,
bool & IncludedUndefinedIds,
Preprocessor & PP )
static

EvaluateDirectiveSubExpr - Evaluate the subexpression whose first token is PeekTok, and whose precedence is PeekPrec.

This returns the result in LHS.

If ValueLive is false, then this value is being evaluated in a context where the result is not used. As such, avoid diagnostics that relate to evaluation, such as division by zero warnings.

Definition at line 592 of file PPExpressions.cpp.

References clang::Preprocessor::Diag(), diagnoseUnexpectedOperator(), clang::Preprocessor::DiscardUntilEndOfDirective(), EvaluateDirectiveSubExpr(), EvaluateValue(), clang::Token::getKind(), clang::Preprocessor::getLangOpts(), clang::Token::getLocation(), getPrecedence(), clang::Preprocessor::getPreprocessorOpts(), DefinedTracker::IncludedUndefinedIds, clang::Token::isNot(), clang::Preprocessor::LexNonComment(), clang::PreprocessorOptions::SingleFileParseMode, and toString().

Referenced by EvaluateDirectiveSubExpr(), and EvaluateValue().

◆ EvaluateValue()

bool EvaluateValue ( PPValue & Result,
Token & PeekTok,
DefinedTracker & DT,
bool ValueLive,
Preprocessor & PP )
static

EvaluateValue - Evaluate the token PeekTok (and any others needed) and return the computed value in Result.

Return true if there was an error parsing. This function also returns information about the form of the expression in DT. See above for information on what DT means.

If ValueLive is false, then this value is being evaluated in a context where the result is not used. As such, avoid diagnostics that relate to evaluation.

Definition at line 233 of file PPExpressions.cpp.

References clang::CodeCompletionHandler::CodeCompletePreprocessorExpression(), DefinedTracker::DefinedMacro, clang::Preprocessor::Diag(), EvaluateDefined(), EvaluateDirectiveSubExpr(), EvaluateValue(), clang::TargetInfo::getChar16Width(), clang::TargetInfo::getChar32Width(), clang::TargetInfo::getCharWidth(), clang::Preprocessor::getCodeCompletionHandler(), clang::DiagnosticsEngine::getDiagnosticOptions(), clang::Preprocessor::getDiagnostics(), clang::Token::getIdentifierInfo(), clang::TargetInfo::getIntWidth(), clang::Token::getKind(), clang::Preprocessor::getLangOpts(), clang::Token::getLocation(), clang::IdentifierInfo::getName(), clang::Preprocessor::getSourceManager(), clang::Preprocessor::getSpelling(), clang::Preprocessor::getTargetInfo(), clang::TargetInfo::getWCharType(), clang::TargetInfo::getWCharWidth(), clang::Token::hasUDSuffix(), DefinedTracker::IncludedUndefinedIds, clang::Token::is(), clang::IdentifierInfo::isCPlusPlusOperatorKeyword(), clang::DiagnosticsEngine::isIgnored(), clang::Token::isNot(), clang::IdentifierInfo::isStr(), clang::TargetInfo::isTypeSigned(), clang::Preprocessor::LexNonComment(), DefinedTracker::NotDefinedMacro, clang::Preprocessor::setCodeCompletionReached(), DefinedTracker::State, clang::DiagnosticOptions::UndefPrefixes, and DefinedTracker::Unknown.

Referenced by EvaluateDirectiveSubExpr(), and EvaluateValue().

◆ getCXXStandardLibraryVersion()

◆ getPrecedence()

unsigned getPrecedence ( tok::TokenKind Kind)
static

getPrecedence - Return the precedence of the specified binary operator token.

This returns: ~0 - Invalid token. 14 -> 3 - various operators. 0 - 'eod' or ')'

Definition at line 547 of file PPExpressions.cpp.

Referenced by EvaluateDirectiveSubExpr().