clang 20.0.0git
Classes | Namespaces | Macros | Typedefs | Enumerations | Functions
ExprConstant.cpp File Reference
#include "ByteCode/Context.h"
#include "ByteCode/Frame.h"
#include "ByteCode/State.h"
#include "ExprConstShared.h"
#include "clang/AST/APValue.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTDiagnostic.h"
#include "clang/AST/ASTLambda.h"
#include "clang/AST/Attr.h"
#include "clang/AST/CXXInheritance.h"
#include "clang/AST/CharUnits.h"
#include "clang/AST/CurrentSourceLocExprScope.h"
#include "clang/AST/Expr.h"
#include "clang/AST/OSLog.h"
#include "clang/AST/OptionalDiagnostic.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/StmtVisitor.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/Builtins.h"
#include "clang/Basic/DiagnosticSema.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/APFixedPoint.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/SaveAndRestore.h"
#include "llvm/Support/SipHash.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/raw_ostream.h"
#include <cstring>
#include <functional>
#include <optional>
#include "clang/AST/TypeNodes.inc"
#include "clang/AST/BuiltinTypes.def"
#include "clang/Basic/OpenCLImageTypes.def"
#include "clang/Basic/OpenCLExtensionTypes.def"
#include "clang/Basic/AArch64SVEACLETypes.def"
#include "clang/Basic/PPCTypes.def"
#include "clang/Basic/RISCVVTypes.def"
#include "clang/Basic/WebAssemblyReferenceTypes.def"
#include "clang/Basic/AMDGPUTypes.def"
#include "clang/Basic/HLSLIntangibleTypes.def"
#include "clang/AST/StmtNodes.inc"

Go to the source code of this file.

Classes

struct  llvm::DenseMapInfo< ObjectUnderConstruction >
 
struct  DynamicType
 

Namespaces

namespace  llvm
 Diagnostic wrappers for TextAPI types for error reporting.
 

Macros

#define DEBUG_TYPE   "exprconstant"
 
#define TYPE(Class, Base)
 
#define ABSTRACT_TYPE(Class, Base)
 
#define NON_CANONICAL_TYPE(Class, Base)
 
#define DEPENDENT_TYPE(Class, Base)
 
#define NON_CANONICAL_UNLESS_DEPENDENT(Class, Base)
 
#define TYPE(ID, BASE)
 
#define DEPENDENT_TYPE(ID, BASE)   case Type::ID:
 
#define NON_CANONICAL_TYPE(ID, BASE)   case Type::ID:
 
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(ID, BASE)   case Type::ID:
 
#define BUILTIN_TYPE(ID, SINGLETON_ID)
 
#define SIGNED_TYPE(ID, SINGLETON_ID)    case BuiltinType::ID: return GCCTypeClass::Integer;
 
#define FLOATING_TYPE(ID, SINGLETON_ID)    case BuiltinType::ID: return GCCTypeClass::RealFloat;
 
#define PLACEHOLDER_TYPE(ID, SINGLETON_ID)    case BuiltinType::ID: break;
 
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix)    case BuiltinType::Id:
 
#define EXT_OPAQUE_TYPE(ExtType, Id, Ext)    case BuiltinType::Id:
 
#define SVE_TYPE(Name, Id, SingletonId)    case BuiltinType::Id:
 
#define PPC_VECTOR_TYPE(Name, Id, Size)    case BuiltinType::Id:
 
#define RVV_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define WASM_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define AMDGPU_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId)   case BuiltinType::Id:
 
#define ABSTRACT_STMT(Node)
 
#define STMT(Node, Base)   case Expr::Node##Class:
 
#define EXPR(Node, Base)
 

Typedefs

using CheckedTemporaries = llvm::SmallPtrSet< const MaterializeTemporaryExpr *, 8 >
 Materialized temporaries that we've already checked to determine if they're initializsed by a constant expression.
 

Enumerations

enum class  CheckEvaluationResultKind { ConstantExpression , FullyInitialized }
 
enum class  SizeOfType { SizeOf , DataSizeOf }
 

Functions

static bool HandleDestruction (EvalInfo &Info, const Expr *E, const LValue &This, QualType ThisType)
 Perform a destructor or pseudo-destructor call on the given object, which might in general not be a complete object.
 
static bool HandleDestruction (EvalInfo &Info, SourceLocation Loc, APValue::LValueBase LVBase, APValue &Value, QualType T)
 Destroy and end the lifetime of the given complete object.
 
static bool isRead (AccessKinds AK)
 
static bool isModification (AccessKinds AK)
 
static bool isAnyAccess (AccessKinds AK)
 
static bool isFormalAccess (AccessKinds AK)
 Is this an access per the C++ definition?
 
static bool isValidIndeterminateAccess (AccessKinds AK)
 Is this kind of axcess valid on an indeterminate object value?
 
static bool Evaluate (APValue &Result, EvalInfo &Info, const Expr *E)
 
static bool EvaluateInPlace (APValue &Result, EvalInfo &Info, const LValue &This, const Expr *E, bool AllowNonLiteralTypes)
 EvaluateInPlace - Evaluate an expression in-place in an APValue.
 
static bool EvaluateLValue (const Expr *E, LValue &Result, EvalInfo &Info, bool InvalidBaseOK)
 Evaluate an expression as an lvalue.
 
static bool EvaluatePointer (const Expr *E, LValue &Result, EvalInfo &Info, bool InvalidBaseOK=false)
 
static bool EvaluateMemberPointer (const Expr *E, MemberPtr &Result, EvalInfo &Info)
 
static bool EvaluateTemporary (const Expr *E, LValue &Result, EvalInfo &Info)
 Evaluate an expression of record type as a temporary.
 
static bool EvaluateInteger (const Expr *E, APSInt &Result, EvalInfo &Info)
 
static bool EvaluateIntegerOrLValue (const Expr *E, APValue &Result, EvalInfo &Info)
 EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and produce either the integer value or a pointer.
 
static bool EvaluateFloat (const Expr *E, APFloat &Result, EvalInfo &Info)
 
static bool EvaluateComplex (const Expr *E, ComplexValue &Res, EvalInfo &Info)
 
static bool EvaluateAtomic (const Expr *E, const LValue *This, APValue &Result, EvalInfo &Info)
 
static bool EvaluateAsRValue (EvalInfo &Info, const Expr *E, APValue &Result)
 EvaluateAsRValue - Try to evaluate this expression, performing an implicit lvalue-to-rvalue cast if it is an lvalue.
 
static bool EvaluateBuiltinStrLen (const Expr *E, uint64_t &Result, EvalInfo &Info, std::string *StringResult=nullptr)
 
static bool EvaluateFixedPointOrInteger (const Expr *E, APFixedPoint &Result, EvalInfo &Info)
 Evaluate an integer or fixed point expression into an APResult.
 
static bool EvaluateFixedPoint (const Expr *E, APFixedPoint &Result, EvalInfo &Info)
 Evaluate only a fixed point expression into an APResult.
 
static void negateAsSigned (APSInt &Int)
 Negate an APSInt in place, converting it to a signed form if necessary, and preserving its value (by extending by up to one bit as needed).
 
static bool EvaluateIgnoredValue (EvalInfo &Info, const Expr *E)
 Evaluate an expression to see if it had side-effects, and discard its result.
 
static bool IsNoOpCall (const CallExpr *E)
 Should this call expression be treated as a no-op?
 
static bool IsGlobalLValue (APValue::LValueBase B)
 
static const ValueDeclGetLValueBaseDecl (const LValue &LVal)
 
static bool IsLiteralLValue (const LValue &Value)
 
static bool IsWeakLValue (const LValue &Value)
 
static bool isZeroSized (const LValue &Value)
 
static bool HasSameBase (const LValue &A, const LValue &B)
 
static void NoteLValueLocation (EvalInfo &Info, APValue::LValueBase Base)
 
static bool CheckEvaluationResult (CheckEvaluationResultKind CERK, EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind, const FieldDecl *SubobjectDecl, CheckedTemporaries &CheckedTemps)
 
static bool CheckLValueConstantExpression (EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal, ConstantExprKind Kind, CheckedTemporaries &CheckedTemps)
 Check that this reference or pointer core constant expression is a valid value for an address or reference constant expression.
 
static bool CheckMemberPointerConstantExpression (EvalInfo &Info, SourceLocation Loc, QualType Type, const APValue &Value, ConstantExprKind Kind)
 Member pointers are constant expressions unless they point to a non-virtual dllimport member function.
 
static bool CheckLiteralType (EvalInfo &Info, const Expr *E, const LValue *This=nullptr)
 Check that this core constant expression is of literal type, and if not, produce an appropriate diagnostic.
 
static bool CheckConstantExpression (EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value, ConstantExprKind Kind)
 Check that this core constant expression value is a valid value for a constant expression.
 
static bool CheckFullyInitialized (EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value)
 Check that this evaluated value is fully-initialized and can be loaded by an lvalue-to-rvalue conversion.
 
static bool CheckMemoryLeaks (EvalInfo &Info)
 Enforce C++2a [expr.const]/4.17, which disallows new-expressions unless "the allocated storage is deallocated within the evaluation".
 
static bool EvalPointerValueAsBool (const APValue &Value, bool &Result)
 
static bool HandleConversionToBool (const APValue &Val, bool &Result)
 
static bool EvaluateAsBooleanCondition (const Expr *E, bool &Result, EvalInfo &Info)
 
template<typename T >
static bool HandleOverflow (EvalInfo &Info, const Expr *E, const T &SrcValue, QualType DestType)
 
static bool HandleFloatToIntCast (EvalInfo &Info, const Expr *E, QualType SrcType, const APFloat &Value, QualType DestType, APSInt &Result)
 
static llvm::RoundingMode getActiveRoundingMode (EvalInfo &Info, const Expr *E)
 Get rounding mode to use in evaluation of the specified expression.
 
static bool checkFloatingPointResult (EvalInfo &Info, const Expr *E, APFloat::opStatus St)
 Check if the given evaluation result is allowed for constant evaluation.
 
static bool HandleFloatToFloatCast (EvalInfo &Info, const Expr *E, QualType SrcType, QualType DestType, APFloat &Result)
 
static APSInt HandleIntToIntCast (EvalInfo &Info, const Expr *E, QualType DestType, QualType SrcType, const APSInt &Value)
 
static bool HandleIntToFloatCast (EvalInfo &Info, const Expr *E, const FPOptions FPO, QualType SrcType, const APSInt &Value, QualType DestType, APFloat &Result)
 
static bool truncateBitfieldValue (EvalInfo &Info, const Expr *E, APValue &Value, const FieldDecl *FD)
 
template<typename Operation >
static bool CheckedIntArithmetic (EvalInfo &Info, const Expr *E, const APSInt &LHS, const APSInt &RHS, unsigned BitWidth, Operation Op, APSInt &Result)
 Perform the given integer operation, which is known to need at most BitWidth bits, and check for overflow in the original type (if that type was not an unsigned type).
 
static bool handleIntIntBinOp (EvalInfo &Info, const BinaryOperator *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result)
 Perform the given binary integer operation.
 
static bool handleFloatFloatBinOp (EvalInfo &Info, const BinaryOperator *E, APFloat &LHS, BinaryOperatorKind Opcode, const APFloat &RHS)
 Perform the given binary floating-point operation, in-place, on LHS.
 
static bool handleLogicalOpForVector (const APInt &LHSValue, BinaryOperatorKind Opcode, const APInt &RHSValue, APInt &Result)
 
static bool handleLogicalOpForVector (const APFloat &LHSValue, BinaryOperatorKind Opcode, const APFloat &RHSValue, APInt &Result)
 
static bool handleLogicalOpForVector (const APValue &LHSValue, BinaryOperatorKind Opcode, const APValue &RHSValue, APInt &Result)
 
template<typename APTy >
static bool handleCompareOpForVectorHelper (const APTy &LHSValue, BinaryOperatorKind Opcode, const APTy &RHSValue, APInt &Result)
 
static bool handleCompareOpForVector (const APValue &LHSValue, BinaryOperatorKind Opcode, const APValue &RHSValue, APInt &Result)
 
static bool handleVectorVectorBinOp (EvalInfo &Info, const BinaryOperator *E, BinaryOperatorKind Opcode, APValue &LHSValue, const APValue &RHSValue)
 
static bool CastToDerivedClass (EvalInfo &Info, const Expr *E, LValue &Result, const RecordDecl *TruncatedType, unsigned TruncatedElements)
 Cast an lvalue referring to a base subobject to a derived class, by truncating the lvalue's path to the given length.
 
static bool HandleLValueDirectBase (EvalInfo &Info, const Expr *E, LValue &Obj, const CXXRecordDecl *Derived, const CXXRecordDecl *Base, const ASTRecordLayout *RL=nullptr)
 
static bool HandleLValueBase (EvalInfo &Info, const Expr *E, LValue &Obj, const CXXRecordDecl *DerivedDecl, const CXXBaseSpecifier *Base)
 
static bool HandleLValueBasePath (EvalInfo &Info, const CastExpr *E, QualType Type, LValue &Result)
 
static bool CastToBaseClass (EvalInfo &Info, const Expr *E, LValue &Result, const CXXRecordDecl *DerivedRD, const CXXRecordDecl *BaseRD)
 Cast an lvalue referring to a derived class to a known base subobject.
 
static bool HandleLValueMember (EvalInfo &Info, const Expr *E, LValue &LVal, const FieldDecl *FD, const ASTRecordLayout *RL=nullptr)
 Update LVal to refer to the given field, which must be a member of the type currently described by LVal.
 
static bool HandleLValueIndirectMember (EvalInfo &Info, const Expr *E, LValue &LVal, const IndirectFieldDecl *IFD)
 Update LVal to refer to the given indirect field.
 
static bool HandleSizeof (EvalInfo &Info, SourceLocation Loc, QualType Type, CharUnits &Size, SizeOfType SOT=SizeOfType::SizeOf)
 Get the size of the given type in char units.
 
static bool HandleLValueArrayAdjustment (EvalInfo &Info, const Expr *E, LValue &LVal, QualType EltTy, APSInt Adjustment)
 Update a pointer value to model pointer arithmetic.
 
static bool HandleLValueArrayAdjustment (EvalInfo &Info, const Expr *E, LValue &LVal, QualType EltTy, int64_t Adjustment)
 
static bool HandleLValueComplexElement (EvalInfo &Info, const Expr *E, LValue &LVal, QualType EltTy, bool Imag)
 Update an lvalue to refer to a component of a complex number.
 
static bool HandleLValueVectorElement (EvalInfo &Info, const Expr *E, LValue &LVal, QualType EltTy, uint64_t Size, uint64_t Idx)
 
static bool evaluateVarDeclInit (EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, unsigned Version, APValue *&Result)
 Try to evaluate the initializer for a variable declaration.
 
static unsigned getBaseIndex (const CXXRecordDecl *Derived, const CXXRecordDecl *Base)
 Get the base index of the given base class within an APValue representing the given derived class.
 
static APSInt extractStringLiteralCharacter (EvalInfo &Info, const Expr *Lit, uint64_t Index)
 Extract the value of a character from a string literal.
 
static void expandStringLiteral (EvalInfo &Info, const StringLiteral *S, APValue &Result, QualType AllocType=QualType())
 
static void expandArray (APValue &Array, unsigned Index)
 
static bool isReadByLvalueToRvalueConversion (const CXXRecordDecl *RD)
 Determine whether a type would actually be read by an lvalue-to-rvalue conversion.
 
static bool isReadByLvalueToRvalueConversion (QualType T)
 
static bool diagnoseMutableFields (EvalInfo &Info, const Expr *E, AccessKinds AK, QualType T)
 Diagnose an attempt to read from any unreadable field within the specified type, which might be a class type.
 
static bool lifetimeStartedInEvaluation (EvalInfo &Info, APValue::LValueBase Base, bool MutableSubobject=false)
 
static bool CheckArraySize (EvalInfo &Info, const ConstantArrayType *CAT, SourceLocation CallLoc={})
 
static QualType getSubobjectType (QualType ObjType, QualType SubobjType, bool IsMutable=false)
 
template<typename SubobjectHandler >
SubobjectHandler::result_type findSubobject (EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, SubobjectHandler &handler)
 Find the designated sub-object of an rvalue.
 
static bool extractSubobject (EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, APValue &Result, AccessKinds AK=AK_Read)
 Extract the designated sub-object of an rvalue.
 
static bool modifySubobject (EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, APValue &NewVal)
 Update the designated sub-object of an rvalue to the given value.
 
static unsigned FindDesignatorMismatch (QualType ObjType, const SubobjectDesignator &A, const SubobjectDesignator &B, bool &WasArrayIndex)
 Find the position where two subobject designators diverge, or equivalently the length of the common initial subsequence.
 
static bool AreElementsOfSameArray (QualType ObjType, const SubobjectDesignator &A, const SubobjectDesignator &B)
 Determine whether the given subobject designators refer to elements of the same array object.
 
static CompleteObject findCompleteObject (EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType)
 Find the complete object to which an LValue refers.
 
static bool handleLValueToRValueConversion (EvalInfo &Info, const Expr *Conv, QualType Type, const LValue &LVal, APValue &RVal, bool WantObjectRepresentation=false)
 Perform an lvalue-to-rvalue conversion on the given glvalue.
 
static bool handleAssignment (EvalInfo &Info, const Expr *E, const LValue &LVal, QualType LValType, APValue &Val)
 Perform an assignment of Val to LVal. Takes ownership of Val.
 
static bool handleCompoundAssignment (EvalInfo &Info, const CompoundAssignOperator *E, const LValue &LVal, QualType LValType, QualType PromotedLValType, BinaryOperatorKind Opcode, const APValue &RVal)
 Perform a compound assignment of LVal <op>= RVal.
 
static bool handleIncDec (EvalInfo &Info, const Expr *E, const LValue &LVal, QualType LValType, bool IsIncrement, APValue *Old)
 Perform an increment or decrement on LVal.
 
static bool EvaluateObjectArgument (EvalInfo &Info, const Expr *Object, LValue &This)
 Build an lvalue for the object argument of a member function call.
 
static const ValueDeclHandleMemberPointerAccess (EvalInfo &Info, QualType LVType, LValue &LV, const Expr *RHS, bool IncludeMember=true)
 HandleMemberPointerAccess - Evaluate a member access operation and build an lvalue referring to the result.
 
static const ValueDeclHandleMemberPointerAccess (EvalInfo &Info, const BinaryOperator *BO, LValue &LV, bool IncludeMember=true)
 
static bool HandleBaseToDerivedCast (EvalInfo &Info, const CastExpr *E, LValue &Result)
 HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on the provided lvalue, which currently refers to the base object.
 
static bool handleDefaultInitValue (QualType T, APValue &Result)
 Get the value to use for a default-initialized object of type T.
 
static bool EvaluateVarDecl (EvalInfo &Info, const VarDecl *VD)
 
static bool EvaluateDecl (EvalInfo &Info, const Decl *D)
 
static bool EvaluateDependentExpr (const Expr *E, EvalInfo &Info)
 
static bool EvaluateCond (EvalInfo &Info, const VarDecl *CondDecl, const Expr *Cond, bool &Result)
 Evaluate a condition (either a variable declaration or an expression).
 
static EvalStmtResult EvaluateStmt (StmtResult &Result, EvalInfo &Info, const Stmt *S, const SwitchCase *SC=nullptr)
 
static EvalStmtResult EvaluateLoopBody (StmtResult &Result, EvalInfo &Info, const Stmt *Body, const SwitchCase *Case=nullptr)
 Evaluate the body of a loop, and translate the result as appropriate.
 
static EvalStmtResult EvaluateSwitch (StmtResult &Result, EvalInfo &Info, const SwitchStmt *SS)
 Evaluate a switch statement.
 
static bool CheckLocalVariableDeclaration (EvalInfo &Info, const VarDecl *VD)
 
static bool CheckTrivialDefaultConstructor (EvalInfo &Info, SourceLocation Loc, const CXXConstructorDecl *CD, bool IsValueInitialization)
 CheckTrivialDefaultConstructor - Check whether a constructor is a trivial default constructor.
 
static bool CheckConstexprFunction (EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition, const Stmt *Body)
 CheckConstexprFunction - Check that a function can be called in a constant expression.
 
static bool checkDynamicType (EvalInfo &Info, const Expr *E, const LValue &This, AccessKinds AK, bool Polymorphic)
 Check that we can access the notional vptr of an object / determine its dynamic type.
 
static bool checkNonVirtualMemberCallThisPointer (EvalInfo &Info, const Expr *E, const LValue &This, const CXXMethodDecl *NamedMember)
 Check that the pointee of the 'this' pointer in a member function call is either within its lifetime or in its period of construction or destruction.
 
static const CXXRecordDeclgetBaseClassType (SubobjectDesignator &Designator, unsigned PathLength)
 
static std::optional< DynamicTypeComputeDynamicType (EvalInfo &Info, const Expr *E, LValue &This, AccessKinds AK)
 Determine the dynamic type of an object.
 
static const CXXMethodDeclHandleVirtualDispatch (EvalInfo &Info, const Expr *E, LValue &This, const CXXMethodDecl *Found, llvm::SmallVectorImpl< QualType > &CovariantAdjustmentPath)
 Perform virtual dispatch.
 
static bool HandleCovariantReturnAdjustment (EvalInfo &Info, const Expr *E, APValue &Result, ArrayRef< QualType > Path)
 Perform the adjustment from a value returned by a virtual function to a value of the statically expected type, which may be a pointer or reference to a base class of the returned type.
 
static bool isBaseClassPublic (const CXXRecordDecl *Derived, const CXXRecordDecl *Base)
 Determine whether Base, which is known to be a direct base class of Derived, is a public base class.
 
static bool HandleDynamicCast (EvalInfo &Info, const ExplicitCastExpr *E, LValue &Ptr)
 Apply the given dynamic cast operation on the provided lvalue.
 
static bool MaybeHandleUnionActiveMemberChange (EvalInfo &Info, const Expr *LHSExpr, const LValue &LHS)
 Handle a builtin simple-assignment or a call to a trivial assignment operator whose left-hand side might involve a union member access.
 
static bool EvaluateCallArg (const ParmVarDecl *PVD, const Expr *Arg, CallRef Call, EvalInfo &Info, bool NonNull=false)
 
static bool EvaluateArgs (ArrayRef< const Expr * > Args, CallRef Call, EvalInfo &Info, const FunctionDecl *Callee, bool RightToLeft=false)
 Evaluate the arguments to a function call.
 
static bool handleTrivialCopy (EvalInfo &Info, const ParmVarDecl *Param, const Expr *E, APValue &Result, bool CopyObjectRepresentation)
 Perform a trivial copy from Param, which is the parameter of a copy or move constructor or assignment operator.
 
static bool HandleFunctionCall (SourceLocation CallLoc, const FunctionDecl *Callee, const LValue *This, const Expr *E, ArrayRef< const Expr * > Args, CallRef Call, const Stmt *Body, EvalInfo &Info, APValue &Result, const LValue *ResultSlot)
 Evaluate a function call.
 
static bool HandleConstructorCall (const Expr *E, const LValue &This, CallRef Call, const CXXConstructorDecl *Definition, EvalInfo &Info, APValue &Result)
 Evaluate a constructor call.
 
static bool HandleConstructorCall (const Expr *E, const LValue &This, ArrayRef< const Expr * > Args, const CXXConstructorDecl *Definition, EvalInfo &Info, APValue &Result)
 
static bool HandleDestructionImpl (EvalInfo &Info, SourceRange CallRange, const LValue &This, APValue &Value, QualType T)
 
static bool HandleOperatorNewCall (EvalInfo &Info, const CallExpr *E, LValue &Result)
 Perform a call to 'operator new' or to ‘__builtin_operator_new’.
 
static bool hasVirtualDestructor (QualType T)
 
static const FunctionDeclgetVirtualOperatorDelete (QualType T)
 
static std::optional< DynAlloc * > CheckDeleteKind (EvalInfo &Info, const Expr *E, const LValue &Pointer, DynAlloc::Kind DeallocKind)
 Check that the given object is a suitable pointer to a heap allocation that still exists and is of the right kind for the purpose of a deletion.
 
bool HandleOperatorDeleteCall (EvalInfo &Info, const CallExpr *E)
 
static bool HandleLambdaCapture (EvalInfo &Info, const Expr *E, LValue &Result, const CXXMethodDecl *MD, const FieldDecl *FD, bool LValueToRValueConversion)
 Get an lvalue to a field of a lambda's closure type.
 
static bool getBytesReturnedByAllocSizeCall (const ASTContext &Ctx, const CallExpr *Call, llvm::APInt &Result)
 Attempts to compute the number of bytes available at the pointer returned by a function with the alloc_size attribute.
 
static bool getBytesReturnedByAllocSizeCall (const ASTContext &Ctx, const LValue &LVal, llvm::APInt &Result)
 Convenience function.
 
static bool evaluateLValueAsAllocSize (EvalInfo &Info, APValue::LValueBase Base, LValue &Result)
 Attempts to evaluate the given LValueBase as the result of a call to a function with the alloc_size attribute.
 
static bool IsDeclSourceLocationCurrent (const FunctionDecl *FD)
 
static CharUnits GetAlignOfType (EvalInfo &Info, QualType T, UnaryExprOrTypeTrait ExprKind)
 
static CharUnits GetAlignOfExpr (EvalInfo &Info, const Expr *E, UnaryExprOrTypeTrait ExprKind)
 
static CharUnits getBaseAlignment (EvalInfo &Info, const LValue &Value)
 
static bool getAlignmentArgument (const Expr *E, QualType ForType, EvalInfo &Info, APSInt &Alignment)
 Evaluate the value of the alignment argument to __builtin_align_{up,down}, __builtin_is_aligned and __builtin_assume_aligned.
 
static bool isOneByteCharacterType (QualType T)
 
static bool EvaluateArrayNewInitList (EvalInfo &Info, LValue &This, APValue &Result, const InitListExpr *ILE, QualType AllocType)
 
static bool EvaluateArrayNewConstructExpr (EvalInfo &Info, LValue &This, APValue &Result, const CXXConstructExpr *CCE, QualType AllocType)
 
static bool HandleClassZeroInitialization (EvalInfo &Info, const Expr *E, const RecordDecl *RD, const LValue &This, APValue &Result)
 Perform zero-initialization on an object of non-union class type.
 
static bool EvaluateRecord (const Expr *E, const LValue &This, APValue &Result, EvalInfo &Info)
 
static bool EvaluateVector (const Expr *E, APValue &Result, EvalInfo &Info)
 
static std::optional< APValuehandleVectorUnaryOperator (ASTContext &Ctx, QualType ResultTy, UnaryOperatorKind Op, APValue Elt)
 
static bool handleVectorElementCast (EvalInfo &Info, const FPOptions FPO, const Expr *E, QualType SourceTy, QualType DestTy, APValue const &Original, APValue &Result)
 
static bool handleVectorShuffle (EvalInfo &Info, const ShuffleVectorExpr *E, QualType ElemType, APValue const &VecVal1, APValue const &VecVal2, unsigned EltNum, APValue &Result)
 
static bool EvaluateArray (const Expr *E, const LValue &This, APValue &Result, EvalInfo &Info)
 
static bool MaybeElementDependentArrayFiller (const Expr *FillerExpr)
 
GCCTypeClass EvaluateBuiltinClassifyType (QualType T, const LangOptions &LangOpts)
 EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way as GCC.
 
static GCCTypeClass EvaluateBuiltinClassifyType (const CallExpr *E, const LangOptions &LangOpts)
 EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way as GCC.
 
static bool EvaluateBuiltinConstantPForLValue (const APValue &LV)
 EvaluateBuiltinConstantPForLValue - Determine the result of __builtin_constant_p when applied to the given pointer.
 
static bool EvaluateBuiltinConstantP (EvalInfo &Info, const Expr *Arg)
 EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to GCC as we can manage.
 
static QualType getObjectType (APValue::LValueBase B)
 Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
 
static const ExprignorePointerCastsAndParens (const Expr *E)
 A more selective version of E->IgnoreParenCasts for tryEvaluateBuiltinObjectSize.
 
static bool isDesignatorAtObjectEnd (const ASTContext &Ctx, const LValue &LVal)
 Checks to see if the given LValue's Designator is at the end of the LValue's record layout.
 
static bool refersToCompleteObject (const LValue &LVal)
 Tests to see if the LValue has a user-specified designator (that isn't necessarily valid).
 
static bool isUserWritingOffTheEnd (const ASTContext &Ctx, const LValue &LVal)
 Attempts to detect a user writing into a piece of memory that's impossible to figure out the size of by just using types.
 
static bool convertUnsignedAPIntToCharUnits (const llvm::APInt &Int, CharUnits &Result)
 Converts the given APInt to CharUnits, assuming the APInt is unsigned.
 
static void addFlexibleArrayMemberInitSize (EvalInfo &Info, const QualType &T, const LValue &LV, CharUnits &Size)
 If we're evaluating the object size of an instance of a struct that contains a flexible array member, add the size of the initializer.
 
static bool determineEndOffset (EvalInfo &Info, SourceLocation ExprLoc, unsigned Type, const LValue &LVal, CharUnits &EndOffset)
 Helper for tryEvaluateBuiltinObjectSize – Given an LValue, this will determine how many bytes exist from the beginning of the object to either the end of the current subobject, or the end of the object itself, depending on what the LValue looks like + the value of Type.
 
static bool tryEvaluateBuiltinObjectSize (const Expr *E, unsigned Type, EvalInfo &Info, uint64_t &Size)
 Tries to evaluate the __builtin_object_size for E.
 
static bool getBuiltinAlignArguments (const CallExpr *E, EvalInfo &Info, APValue &Val, APSInt &Alignment)
 
static bool isOnePastTheEndOfCompleteObject (const ASTContext &Ctx, const LValue &LV)
 Determine whether this is a pointer past the end of the complete object referred to by the lvalue.
 
static void addOrSubLValueAsInteger (APValue &LVal, const APSInt &Index, bool IsSub)
 
template<class SuccessCB , class AfterCB >
static bool EvaluateComparisonBinaryOperator (EvalInfo &Info, const BinaryOperator *E, SuccessCB &&Success, AfterCB &&DoAfter)
 
static bool TryEvaluateBuiltinNaN (const ASTContext &Context, QualType ResultTy, const Expr *Arg, bool SNaN, llvm::APFloat &Result)
 
void HandleComplexComplexMul (APFloat A, APFloat B, APFloat C, APFloat D, APFloat &ResR, APFloat &ResI)
 
void HandleComplexComplexDiv (APFloat A, APFloat B, APFloat C, APFloat D, APFloat &ResR, APFloat &ResI)
 
static bool EvaluateVoid (const Expr *E, EvalInfo &Info)
 
static bool FastEvaluateAsRValue (const Expr *Exp, Expr::EvalResult &Result, const ASTContext &Ctx, bool &IsConst)
 
static bool hasUnacceptableSideEffect (Expr::EvalStatus &Result, Expr::SideEffectsKind SEK)
 
static bool EvaluateAsRValue (const Expr *E, Expr::EvalResult &Result, const ASTContext &Ctx, EvalInfo &Info)
 
static bool EvaluateAsInt (const Expr *E, Expr::EvalResult &ExprResult, const ASTContext &Ctx, Expr::SideEffectsKind AllowSideEffects, EvalInfo &Info)
 
static bool EvaluateAsFixedPoint (const Expr *E, Expr::EvalResult &ExprResult, const ASTContext &Ctx, Expr::SideEffectsKind AllowSideEffects, EvalInfo &Info)
 
static bool EvaluateDestruction (const ASTContext &Ctx, APValue::LValueBase Base, APValue DestroyedValue, QualType Type, SourceLocation Loc, Expr::EvalStatus &EStatus, bool IsConstantDestruction)
 
static ICEDiag NoDiag ()
 
static ICEDiag Worst (ICEDiag A, ICEDiag B)
 
static ICEDiag CheckEvalInICE (const Expr *E, const ASTContext &Ctx)
 
static ICEDiag CheckICE (const Expr *E, const ASTContext &Ctx)
 
static bool EvaluateCPlusPlus11IntegralConstantExpr (const ASTContext &Ctx, const Expr *E, llvm::APSInt *Value, SourceLocation *Loc)
 Evaluate an expression as a C++11 integral constant expression.
 

Macro Definition Documentation

◆ ABSTRACT_STMT

#define ABSTRACT_STMT (   Node)

◆ ABSTRACT_TYPE

#define ABSTRACT_TYPE (   Class,
  Base 
)

◆ AMDGPU_TYPE

#define AMDGPU_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ BUILTIN_TYPE

#define BUILTIN_TYPE (   ID,
  SINGLETON_ID 
)

◆ DEBUG_TYPE

#define DEBUG_TYPE   "exprconstant"

Definition at line 68 of file ExprConstant.cpp.

◆ DEPENDENT_TYPE [1/2]

#define DEPENDENT_TYPE (   Class,
  Base 
)
Value:
case Type::Class: \
llvm_unreachable( \
"dependent types aren't supported in the constant evaluator!");

◆ DEPENDENT_TYPE [2/2]

#define DEPENDENT_TYPE (   ID,
  BASE 
)    case Type::ID:

◆ EXPR

#define EXPR (   Node,
  Base 
)

◆ EXT_OPAQUE_TYPE

#define EXT_OPAQUE_TYPE (   ExtType,
  Id,
  Ext 
)     case BuiltinType::Id:

◆ FLOATING_TYPE

#define FLOATING_TYPE (   ID,
  SINGLETON_ID 
)     case BuiltinType::ID: return GCCTypeClass::RealFloat;

◆ HLSL_INTANGIBLE_TYPE

#define HLSL_INTANGIBLE_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ IMAGE_TYPE

#define IMAGE_TYPE (   ImgType,
  Id,
  SingletonId,
  Access,
  Suffix 
)     case BuiltinType::Id:

◆ NON_CANONICAL_TYPE [1/2]

#define NON_CANONICAL_TYPE (   Class,
  Base 
)
Value:
case Type::Class: \
llvm_unreachable("non-canonical type should be impossible!");

◆ NON_CANONICAL_TYPE [2/2]

#define NON_CANONICAL_TYPE (   ID,
  BASE 
)    case Type::ID:

◆ NON_CANONICAL_UNLESS_DEPENDENT

#define NON_CANONICAL_UNLESS_DEPENDENT (   Class,
  Base 
)
Value:
case Type::Class: \
llvm_unreachable("either dependent or not canonical!");

◆ NON_CANONICAL_UNLESS_DEPENDENT_TYPE

#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE (   ID,
  BASE 
)    case Type::ID:

◆ PLACEHOLDER_TYPE

#define PLACEHOLDER_TYPE (   ID,
  SINGLETON_ID 
)     case BuiltinType::ID: break;

◆ PPC_VECTOR_TYPE

#define PPC_VECTOR_TYPE (   Name,
  Id,
  Size 
)     case BuiltinType::Id:

◆ RVV_TYPE

#define RVV_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

◆ SIGNED_TYPE

#define SIGNED_TYPE (   ID,
  SINGLETON_ID 
)     case BuiltinType::ID: return GCCTypeClass::Integer;

◆ STMT

#define STMT (   Node,
  Base 
)    case Expr::Node##Class:

◆ SVE_TYPE

#define SVE_TYPE (   Name,
  Id,
  SingletonId 
)     case BuiltinType::Id:

◆ TYPE [1/2]

#define TYPE (   Class,
  Base 
)
Value:
case Type::Class: \
return visit(cast<Class##Type>(Can.getTypePtr()), Offset);

◆ TYPE [2/2]

#define TYPE (   ID,
  BASE 
)

◆ WASM_TYPE

#define WASM_TYPE (   Name,
  Id,
  SingletonId 
)    case BuiltinType::Id:

Typedef Documentation

◆ CheckedTemporaries

Materialized temporaries that we've already checked to determine if they're initializsed by a constant expression.

Definition at line 2218 of file ExprConstant.cpp.

Enumeration Type Documentation

◆ CheckEvaluationResultKind

enum class CheckEvaluationResultKind
strong
Enumerator
ConstantExpression 
FullyInitialized 

Definition at line 2211 of file ExprConstant.cpp.

◆ SizeOfType

enum class SizeOfType
strong
Enumerator
SizeOf 
DataSizeOf 

Definition at line 3256 of file ExprConstant.cpp.

Function Documentation

◆ addFlexibleArrayMemberInitSize()

static void addFlexibleArrayMemberInitSize ( EvalInfo &  Info,
const QualType T,
const LValue &  LV,
CharUnits Size 
)
static

If we're evaluating the object size of an instance of a struct that contains a flexible array member, add the size of the initializer.

Definition at line 12341 of file ExprConstant.cpp.

References clang::Type::getAsStructureType(), clang::RecordType::getDecl(), clang::VarDecl::getFlexibleArrayInitChars(), clang::RecordDecl::hasFlexibleArrayMember(), clang::VarDecl::hasInit(), clang::Type::isStructureType(), clang::T, and V.

Referenced by determineEndOffset().

◆ addOrSubLValueAsInteger()

static void addOrSubLValueAsInteger ( APValue LVal,
const APSInt Index,
bool  IsSub 
)
static

◆ AreElementsOfSameArray()

static bool AreElementsOfSameArray ( QualType  ObjType,
const SubobjectDesignator &  A,
const SubobjectDesignator &  B 
)
static

Determine whether the given subobject designators refer to elements of the same array object.

Definition at line 4090 of file ExprConstant.cpp.

References FindDesignatorMismatch().

◆ CastToBaseClass()

static bool CastToBaseClass ( EvalInfo &  Info,
const Expr E,
LValue &  Result,
const CXXRecordDecl DerivedRD,
const CXXRecordDecl BaseRD 
)
static

Cast an lvalue referring to a derived class to a known base subobject.

Definition at line 3216 of file ExprConstant.cpp.

References E, HandleLValueBase(), and clang::CXXRecordDecl::isDerivedFrom().

Referenced by HandleCovariantReturnAdjustment().

◆ CastToDerivedClass()

static bool CastToDerivedClass ( EvalInfo &  Info,
const Expr E,
LValue &  Result,
const RecordDecl TruncatedType,
unsigned  TruncatedElements 
)
static

Cast an lvalue referring to a base subobject to a derived class, by truncating the lvalue's path to the given length.

Definition at line 3134 of file ExprConstant.cpp.

References clang::CSK_Derived, D, E, clang::ASTRecordLayout::getBaseClassOffset(), clang::ASTRecordLayout::getVBaseClassOffset(), and clang::Decl::isInvalidDecl().

Referenced by HandleBaseToDerivedCast(), HandleDynamicCast(), HandleLValueBase(), HandleMemberPointerAccess(), and HandleVirtualDispatch().

◆ CheckArraySize()

static bool CheckArraySize ( EvalInfo &  Info,
const ConstantArrayType CAT,
SourceLocation  CallLoc = {} 
)
static

Definition at line 3676 of file ExprConstant.cpp.

Referenced by findSubobject(), and HandleDestructionImpl().

◆ CheckConstantExpression()

static bool CheckConstantExpression ( EvalInfo &  Info,
SourceLocation  DiagLoc,
QualType  Type,
const APValue Value,
ConstantExprKind  Kind 
)
static

Check that this core constant expression value is a valid value for a constant expression.

If not, report an appropriate diagnostic. Does not check that the expression is of literal type.

Definition at line 2550 of file ExprConstant.cpp.

References CheckEvaluationResult(), and clang::Type::isVoidType().

Referenced by clang::Expr::EvaluateAsConstantExpr(), clang::Expr::EvaluateAsInitializer(), and EvaluateAsRValue().

◆ CheckConstexprFunction()

static bool CheckConstexprFunction ( EvalInfo &  Info,
SourceLocation  CallLoc,
const FunctionDecl Declaration,
const FunctionDecl Definition,
const Stmt Body 
)
static

CheckConstexprFunction - Check that a function can be called in a constant expression.

Definition at line 5731 of file ExprConstant.cpp.

References bool, clang::Declaration, clang::Definition, clang::Decl::getLocation(), clang::DeclContext::getParent(), and clang::FunctionDecl::isConstexpr().

Referenced by HandleDestructionImpl().

◆ CheckDeleteKind()

static std::optional< DynAlloc * > CheckDeleteKind ( EvalInfo &  Info,
const Expr E,
const LValue &  Pointer,
DynAlloc::Kind  DeallocKind 
)
static

Check that the given object is a suitable pointer to a heap allocation that still exists and is of the right kind for the purpose of a deletion.

On success, returns the heap allocation to deallocate. On failure, produces a diagnostic and returns std::nullopt.

Definition at line 6957 of file ExprConstant.cpp.

References E, NoteLValueLocation(), and Pointer.

Referenced by HandleOperatorDeleteCall().

◆ checkDynamicType()

static bool checkDynamicType ( EvalInfo &  Info,
const Expr E,
const LValue &  This,
AccessKinds  AK,
bool  Polymorphic 
)
static

Check that we can access the notional vptr of an object / determine its dynamic type.

Definition at line 5808 of file ExprConstant.cpp.

References E, findCompleteObject(), findSubobject(), and clang::APValue::getAsString().

Referenced by checkNonVirtualMemberCallThisPointer(), and ComputeDynamicType().

◆ CheckedIntArithmetic()

template<typename Operation >
static bool CheckedIntArithmetic ( EvalInfo &  Info,
const Expr E,
const APSInt LHS,
const APSInt RHS,
unsigned  BitWidth,
Operation  Op,
APSInt Result 
)
static

Perform the given integer operation, which is known to need at most BitWidth bits, and check for overflow in the original type (if that type was not an unsigned type).

Definition at line 2796 of file ExprConstant.cpp.

References E, clang::Expr::getExprLoc(), clang::Stmt::getSourceRange(), clang::Expr::getType(), HandleOverflow(), and toString().

Referenced by handleIntIntBinOp().

◆ CheckEvalInICE()

static ICEDiag CheckEvalInICE ( const Expr E,
const ASTContext Ctx 
)
static

◆ CheckEvaluationResult()

static bool CheckEvaluationResult ( CheckEvaluationResultKind  CERK,
EvalInfo &  Info,
SourceLocation  DiagLoc,
QualType  Type,
const APValue Value,
ConstantExprKind  Kind,
const FieldDecl SubobjectDecl,
CheckedTemporaries CheckedTemps 
)
static

◆ checkFloatingPointResult()

static bool checkFloatingPointResult ( EvalInfo &  Info,
const Expr E,
APFloat::opStatus  St 
)
static

Check if the given evaluation result is allowed for constant evaluation.

Definition at line 2692 of file ExprConstant.cpp.

References E, clang::FPOptions::getExceptionMode(), clang::Expr::getFPFeaturesInEffect(), and clang::FPOptions::getRoundingMode().

Referenced by handleFloatFloatBinOp(), HandleFloatToFloatCast(), and HandleIntToFloatCast().

◆ CheckFullyInitialized()

static bool CheckFullyInitialized ( EvalInfo &  Info,
SourceLocation  DiagLoc,
QualType  Type,
const APValue Value 
)
static

Check that this evaluated value is fully-initialized and can be loaded by an lvalue-to-rvalue conversion.

Definition at line 2565 of file ExprConstant.cpp.

References CheckEvaluationResult().

◆ CheckICE()

static ICEDiag CheckICE ( const Expr E,
const ASTContext Ctx 
)
static

◆ CheckLiteralType()

static bool CheckLiteralType ( EvalInfo &  Info,
const Expr E,
const LValue *  This = nullptr 
)
static

Check that this core constant expression is of literal type, and if not, produce an appropriate diagnostic.

Definition at line 2421 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Type::isLiteralType(), and clang::Expr::isPRValue().

Referenced by CheckConstexprDeclStmt(), CheckConstexprParameterTypes(), CheckConstexprReturnType(), EvaluateAsRValue(), and EvaluateInPlace().

◆ CheckLocalVariableDeclaration()

static bool CheckLocalVariableDeclaration ( EvalInfo &  Info,
const VarDecl VD 
)
static

◆ CheckLValueConstantExpression()

static bool CheckLValueConstantExpression ( EvalInfo &  Info,
SourceLocation  Loc,
QualType  Type,
const LValue &  LVal,
ConstantExprKind  Kind,
CheckedTemporaries CheckedTemps 
)
static

Check that this reference or pointer core constant expression is a valid value for an address or reference constant expression.

Return true if we can fold this expression, whether or not it's a constant expression.

Definition at line 2231 of file ExprConstant.cpp.

References CheckEvaluationResult(), clang::FixItHint::CreateInsertion(), clang::Type::isAnyPointerType(), clang::QualType::isDestructedType(), IsGlobalLValue(), clang::Type::isReferenceType(), Loc, NoteLValueLocation(), and V.

Referenced by CheckEvaluationResult(), and clang::Expr::EvaluateAsLValue().

◆ CheckMemberPointerConstantExpression()

static bool CheckMemberPointerConstantExpression ( EvalInfo &  Info,
SourceLocation  Loc,
QualType  Type,
const APValue Value,
ConstantExprKind  Kind 
)
static

Member pointers are constant expressions unless they point to a non-virtual dllimport member function.

Definition at line 2401 of file ExprConstant.cpp.

References Loc, and clang::Member.

Referenced by CheckEvaluationResult().

◆ CheckMemoryLeaks()

static bool CheckMemoryLeaks ( EvalInfo &  Info)
static

Enforce C++2a [expr.const]/4.17, which disallows new-expressions unless "the allocated storage is deallocated within the evaluation".

Definition at line 2575 of file ExprConstant.cpp.

Referenced by clang::Expr::EvaluateAsConstantExpr(), clang::Expr::EvaluateAsInitializer(), EvaluateAsRValue(), and clang::Expr::EvaluateCharRangeAsString().

◆ checkNonVirtualMemberCallThisPointer()

static bool checkNonVirtualMemberCallThisPointer ( EvalInfo &  Info,
const Expr E,
const LValue &  This,
const CXXMethodDecl NamedMember 
)
static

Check that the pointee of the 'this' pointer in a member function call is either within its lifetime or in its period of construction or destruction.

Definition at line 5850 of file ExprConstant.cpp.

References clang::AK_Destroy, clang::AK_MemberCall, checkDynamicType(), and E.

◆ CheckTrivialDefaultConstructor()

static bool CheckTrivialDefaultConstructor ( EvalInfo &  Info,
SourceLocation  Loc,
const CXXConstructorDecl CD,
bool  IsValueInitialization 
)
static

CheckTrivialDefaultConstructor - Check whether a constructor is a trivial default constructor.

If so, we'll fold it whether or not it's marked as constexpr. If it is marked as constexpr, we will never implicitly define it, so we need special handling.

Definition at line 5706 of file ExprConstant.cpp.

References clang::Decl::getLocation(), clang::FunctionDecl::isConstexpr(), clang::CXXConstructorDecl::isDefaultConstructor(), clang::FunctionDecl::isTrivial(), and Loc.

◆ ComputeDynamicType()

static std::optional< DynamicType > ComputeDynamicType ( EvalInfo &  Info,
const Expr E,
LValue &  This,
AccessKinds  AK 
)
static

Determine the dynamic type of an object.

Definition at line 5875 of file ExprConstant.cpp.

References checkDynamicType(), clang::Class, E, getBaseClassType(), and Path.

Referenced by HandleDynamicCast(), and HandleVirtualDispatch().

◆ convertUnsignedAPIntToCharUnits()

static bool convertUnsignedAPIntToCharUnits ( const llvm::APInt &  Int,
CharUnits Result 
)
static

Converts the given APInt to CharUnits, assuming the APInt is unsigned.

Fails if the conversion would cause loss of precision.

Definition at line 12330 of file ExprConstant.cpp.

References clang::CharUnits::fromQuantity().

Referenced by determineEndOffset().

◆ determineEndOffset()

static bool determineEndOffset ( EvalInfo &  Info,
SourceLocation  ExprLoc,
unsigned  Type,
const LValue &  LVal,
CharUnits EndOffset 
)
static

Helper for tryEvaluateBuiltinObjectSize – Given an LValue, this will determine how many bytes exist from the beginning of the object to either the end of the current subobject, or the end of the object itself, depending on what the LValue looks like + the value of Type.

If this returns false, the value of Result is undefined.

Definition at line 12357 of file ExprConstant.cpp.

References addFlexibleArrayMemberInitSize(), convertUnsignedAPIntToCharUnits(), getBytesReturnedByAllocSizeCall(), getObjectType(), HandleSizeof(), clang::Type::isFunctionType(), clang::Type::isIncompleteType(), clang::QualType::isNull(), isUserWritingOffTheEnd(), and refersToCompleteObject().

Referenced by tryEvaluateBuiltinObjectSize().

◆ diagnoseMutableFields()

static bool diagnoseMutableFields ( EvalInfo &  Info,
const Expr E,
AccessKinds  AK,
QualType  T 
)
static

◆ EvalPointerValueAsBool()

static bool EvalPointerValueAsBool ( const APValue Value,
bool Result 
)
static

Definition at line 2587 of file ExprConstant.cpp.

Referenced by HandleConversionToBool().

◆ Evaluate()

static bool Evaluate ( APValue Result,
EvalInfo &  Info,
const Expr E 
)
static

◆ EvaluateArgs()

static bool EvaluateArgs ( ArrayRef< const Expr * >  Args,
CallRef  Call,
EvalInfo &  Info,
const FunctionDecl Callee,
bool  RightToLeft = false 
)
static

Evaluate the arguments to a function call.

Definition at line 6315 of file ExprConstant.cpp.

References clang::Call, EvaluateCallArg(), clang::NonNull, and clang::Success.

Referenced by HandleConstructorCall().

◆ EvaluateArray()

static bool EvaluateArray ( const Expr E,
const LValue &  This,
APValue Result,
EvalInfo &  Info 
)
static

◆ EvaluateArrayNewConstructExpr()

static bool EvaluateArrayNewConstructExpr ( EvalInfo &  Info,
LValue &  This,
APValue Result,
const CXXConstructExpr CCE,
QualType  AllocType 
)
static

◆ EvaluateArrayNewInitList()

static bool EvaluateArrayNewInitList ( EvalInfo &  Info,
LValue &  This,
APValue Result,
const InitListExpr ILE,
QualType  AllocType 
)
static

◆ EvaluateAsBooleanCondition()

static bool EvaluateAsBooleanCondition ( const Expr E,
bool Result,
EvalInfo &  Info 
)
static

◆ EvaluateAsFixedPoint()

static bool EvaluateAsFixedPoint ( const Expr E,
Expr::EvalResult ExprResult,
const ASTContext Ctx,
Expr::SideEffectsKind  AllowSideEffects,
EvalInfo &  Info 
)
static

◆ EvaluateAsInt()

static bool EvaluateAsInt ( const Expr E,
Expr::EvalResult ExprResult,
const ASTContext Ctx,
Expr::SideEffectsKind  AllowSideEffects,
EvalInfo &  Info 
)
static

◆ EvaluateAsRValue() [1/2]

static bool EvaluateAsRValue ( const Expr E,
Expr::EvalResult Result,
const ASTContext Ctx,
EvalInfo &  Info 
)
static

◆ EvaluateAsRValue() [2/2]

static bool EvaluateAsRValue ( EvalInfo &  Info,
const Expr E,
APValue Result 
)
static

◆ EvaluateAtomic()

static bool EvaluateAtomic ( const Expr E,
const LValue *  This,
APValue Result,
EvalInfo &  Info 
)
static

◆ EvaluateBuiltinClassifyType() [1/2]

static GCCTypeClass EvaluateBuiltinClassifyType ( const CallExpr E,
const LangOptions LangOpts 
)
static

EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way as GCC.

Definition at line 12050 of file ExprConstant.cpp.

References E, EvaluateBuiltinClassifyType(), and clang::Expr::getType().

◆ EvaluateBuiltinClassifyType() [2/2]

GCCTypeClass EvaluateBuiltinClassifyType ( QualType  T,
const LangOptions LangOpts 
)

◆ EvaluateBuiltinConstantP()

static bool EvaluateBuiltinConstantP ( EvalInfo &  Info,
const Expr Arg 
)
static

◆ EvaluateBuiltinConstantPForLValue()

static bool EvaluateBuiltinConstantPForLValue ( const APValue LV)
static

EvaluateBuiltinConstantPForLValue - Determine the result of __builtin_constant_p when applied to the given pointer.

A pointer is only "constant" if it is null (or a pointer cast to integer) or it points to the first character of a string literal.

Definition at line 12067 of file ExprConstant.cpp.

References E, clang::APValue::getLValueBase(), clang::APValue::getLValueOffset(), and clang::CharUnits::isZero().

Referenced by EvaluateBuiltinConstantP().

◆ EvaluateBuiltinStrLen()

static bool EvaluateBuiltinStrLen ( const Expr E,
uint64_t &  Result,
EvalInfo &  Info,
std::string *  StringResult = nullptr 
)
static

◆ EvaluateCallArg()

static bool EvaluateCallArg ( const ParmVarDecl PVD,
const Expr Arg,
CallRef  Call,
EvalInfo &  Info,
bool  NonNull = false 
)
static

◆ EvaluateComparisonBinaryOperator()

template<class SuccessCB , class AfterCB >
static bool EvaluateComparisonBinaryOperator ( EvalInfo &  Info,
const BinaryOperator E,
SuccessCB &&  Success,
AfterCB &&  DoAfter 
)
static

◆ EvaluateComplex()

static bool EvaluateComplex ( const Expr E,
ComplexValue &  Res,
EvalInfo &  Info 
)
static

◆ EvaluateCond()

static bool EvaluateCond ( EvalInfo &  Info,
const VarDecl CondDecl,
const Expr Cond,
bool Result 
)
static

Evaluate a condition (either a variable declaration or an expression).

Definition at line 5073 of file ExprConstant.cpp.

References EvaluateAsBooleanCondition(), EvaluateDecl(), and clang::Expr::isValueDependent().

Referenced by EvaluateStmt().

◆ EvaluateCPlusPlus11IntegralConstantExpr()

static bool EvaluateCPlusPlus11IntegralConstantExpr ( const ASTContext Ctx,
const Expr E,
llvm::APSInt Value,
SourceLocation Loc 
)
static

◆ EvaluateDecl()

static bool EvaluateDecl ( EvalInfo &  Info,
const Decl D 
)
static

Definition at line 5049 of file ExprConstant.cpp.

References D, EvaluateDecl(), and EvaluateVarDecl().

Referenced by EvaluateCond(), EvaluateDecl(), EvaluateStmt(), and EvaluateSwitch().

◆ EvaluateDependentExpr()

static bool EvaluateDependentExpr ( const Expr E,
EvalInfo &  Info 
)
static

◆ EvaluateDestruction()

static bool EvaluateDestruction ( const ASTContext Ctx,
APValue::LValueBase  Base,
APValue  DestroyedValue,
QualType  Type,
SourceLocation  Loc,
Expr::EvalStatus EStatus,
bool  IsConstantDestruction 
)
static

◆ EvaluateFixedPoint()

static bool EvaluateFixedPoint ( const Expr E,
APFixedPoint &  Result,
EvalInfo &  Info 
)
static

Evaluate only a fixed point expression into an APResult.

Definition at line 11836 of file ExprConstant.cpp.

References E, clang::APValue::getFixedPoint(), clang::Expr::getType(), clang::APValue::isFixedPoint(), clang::Type::isFixedPointType(), and clang::Expr::isValueDependent().

Referenced by EvaluateFixedPointOrInteger().

◆ EvaluateFixedPointOrInteger()

static bool EvaluateFixedPointOrInteger ( const Expr E,
APFixedPoint &  Result,
EvalInfo &  Info 
)
static

Evaluate an integer or fixed point expression into an APResult.

Definition at line 11852 of file ExprConstant.cpp.

References E, EvaluateFixedPoint(), EvaluateInteger(), clang::Expr::getType(), clang::Type::isFixedPointType(), clang::Type::isIntegerType(), and clang::Expr::isValueDependent().

Referenced by EvaluateComparisonBinaryOperator().

◆ EvaluateFloat()

static bool EvaluateFloat ( const Expr E,
APFloat &  Result,
EvalInfo &  Info 
)
static

◆ EvaluateIgnoredValue()

static bool EvaluateIgnoredValue ( EvalInfo &  Info,
const Expr E 
)
static

Evaluate an expression to see if it had side-effects, and discard its result.

Returns
true if the caller should keep evaluating.

Definition at line 2051 of file ExprConstant.cpp.

References E, Evaluate(), and clang::Expr::isValueDependent().

Referenced by EvaluateStmt(), HandleOperatorDeleteCall(), and HandleOperatorNewCall().

◆ EvaluateInPlace()

static bool EvaluateInPlace ( APValue Result,
EvalInfo &  Info,
const LValue &  This,
const Expr E,
bool  AllowNonLiteralTypes 
)
static

EvaluateInPlace - Evaluate an expression in-place in an APValue.

In some cases, the in-place evaluation is essential, since later initializers for an object can indirectly refer to subobjects which were initialized earlier.

Definition at line 15973 of file ExprConstant.cpp.

References CheckLiteralType(), E, Evaluate(), EvaluateArray(), EvaluateAtomic(), EvaluateRecord(), clang::Expr::getType(), clang::Type::isArrayType(), clang::Type::isAtomicType(), clang::Expr::isPRValue(), clang::Type::isRecordType(), clang::Expr::isValueDependent(), and clang::T.

Referenced by clang::Expr::EvaluateAsConstantExpr(), clang::Expr::EvaluateAsInitializer(), EvaluateCallArg(), EvaluateStmt(), EvaluateVarDecl(), HandleClassZeroInitialization(), and HandleConstructorCall().

◆ EvaluateInteger()

static bool EvaluateInteger ( const Expr E,
APSInt Result,
EvalInfo &  Info 
)
static

◆ EvaluateIntegerOrLValue()

static bool EvaluateIntegerOrLValue ( const Expr E,
APValue Result,
EvalInfo &  Info 
)
static

EvaluateIntegerOrLValue - Evaluate an rvalue integral-typed expression, and produce either the integer value or a pointer.

GCC has a heinous extension which folds casts between pointer types and pointer-sized integral types. We support this by allowing the evaluation of an integer rvalue to produce a pointer (represented as an lvalue) instead. Some simple arithmetic on such values is supported (they are treated much like char*).

Definition at line 11808 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Type::isIntegralOrEnumerationType(), clang::Expr::isPRValue(), and clang::Expr::isValueDependent().

Referenced by EvaluateInteger().

◆ EvaluateLoopBody()

static EvalStmtResult EvaluateLoopBody ( StmtResult &  Result,
EvalInfo &  Info,
const Stmt Body,
const SwitchCase Case = nullptr 
)
static

Evaluate the body of a loop, and translate the result as appropriate.

Definition at line 5114 of file ExprConstant.cpp.

References EvaluateStmt().

Referenced by EvaluateStmt().

◆ EvaluateLValue()

static bool EvaluateLValue ( const Expr E,
LValue &  Result,
EvalInfo &  Info,
bool  InvalidBaseOK 
)
static

Evaluate an expression as an lvalue.

This can be legitimately called on expressions which are not glvalues, in three cases:

  • function designators in C, and
  • "extern void" objects
  • @selector() expressions in Objective-C

Definition at line 8657 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Expr::IgnoreParens(), clang::Type::isFunctionType(), clang::Expr::isGLValue(), clang::Expr::isValueDependent(), and clang::Type::isVoidType().

Referenced by Evaluate(), clang::Expr::EvaluateAsLValue(), EvaluateComparisonBinaryOperator(), and EvaluateObjectArgument().

◆ evaluateLValueAsAllocSize()

static bool evaluateLValueAsAllocSize ( EvalInfo &  Info,
APValue::LValueBase  Base,
LValue &  Result 
)
static

Attempts to evaluate the given LValueBase as the result of a call to a function with the alloc_size attribute.

If it was possible to do so, this function will return true, make Result's Base point to said function call, and mark Result's Base as invalid.

Definition at line 9134 of file ExprConstant.cpp.

References clang::Type::castAs(), E, clang::VarDecl::getAnyInitializer(), getPointeeType(), clang::ValueDecl::getType(), clang::Expr::getType(), clang::Init, clang::QualType::isConstQualified(), and clang::VarDecl::isLocalVarDecl().

◆ EvaluateMemberPointer()

static bool EvaluateMemberPointer ( const Expr E,
MemberPtr &  Result,
EvalInfo &  Info 
)
static

◆ EvaluateObjectArgument()

static bool EvaluateObjectArgument ( EvalInfo &  Info,
const Expr Object,
LValue &  This 
)
static

Build an lvalue for the object argument of a member function call.

Definition at line 4784 of file ExprConstant.cpp.

References EvaluateLValue(), EvaluatePointer(), and EvaluateTemporary().

Referenced by clang::Expr::EvaluateWithSubstitution(), and HandleMemberPointerAccess().

◆ EvaluatePointer()

static bool EvaluatePointer ( const Expr E,
LValue &  Result,
EvalInfo &  Info,
bool  InvalidBaseOK = false 
)
static

◆ EvaluateRecord()

static bool EvaluateRecord ( const Expr E,
const LValue &  This,
APValue Result,
EvalInfo &  Info 
)
static

◆ EvaluateStmt()

static EvalStmtResult EvaluateStmt ( StmtResult &  Result,
EvalInfo &  Info,
const Stmt S,
const SwitchCase SC = nullptr 
)
static

◆ EvaluateSwitch()

static EvalStmtResult EvaluateSwitch ( StmtResult &  Result,
EvalInfo &  Info,
const SwitchStmt SS 
)
static

◆ EvaluateTemporary()

static bool EvaluateTemporary ( const Expr E,
LValue &  Result,
EvalInfo &  Info 
)
static

Evaluate an expression of record type as a temporary.

Definition at line 10808 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Expr::isPRValue(), clang::Type::isRecordType(), and clang::Expr::isValueDependent().

Referenced by EvaluateObjectArgument().

◆ EvaluateVarDecl()

static bool EvaluateVarDecl ( EvalInfo &  Info,
const VarDecl VD 
)
static

◆ evaluateVarDeclInit()

static bool evaluateVarDeclInit ( EvalInfo &  Info,
const Expr E,
const VarDecl VD,
CallStackFrame *  Frame,
unsigned  Version,
APValue *&  Result 
)
static

Try to evaluate the initializer for a variable declaration.

Parameters
InfoInformation about the ongoing evaluation.
EAn expression to be used when printing diagnostics.
VDThe variable whose initializer should be obtained.
VersionThe version of the variable within the frame.
FrameThe frame in which the variable was created. Must be null if this variable is not local to the evaluation.
ResultFilled in with a pointer to the value of the variable.

Definition at line 3354 of file ExprConstant.cpp.

References E, clang::VarDecl::evaluateValue(), clang::VarDecl::getAnyInitializer(), clang::Stmt::getBeginLoc(), clang::Decl::getDeclContext(), clang::VarDecl::getEvaluatedValue(), clang::ValueDecl::getType(), clang::VarDecl::hasConstantInitialization(), clang::VarDecl::hasICEInitializer(), clang::Init, clang::VarDecl::isInitCapture(), clang::isLambdaCallOperator(), clang::Expr::isValueDependent(), clang::ValueDecl::isWeak(), clang::VarDecl::mightBeUsableInConstantExpressions(), and NoteLValueLocation().

Referenced by findCompleteObject().

◆ EvaluateVector()

static bool EvaluateVector ( const Expr E,
APValue Result,
EvalInfo &  Info 
)
static

Definition at line 10855 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Expr::isPRValue(), and clang::Type::isVectorType().

Referenced by Evaluate().

◆ EvaluateVoid()

static bool EvaluateVoid ( const Expr E,
EvalInfo &  Info 
)
static

◆ expandArray()

static void expandArray ( APValue Array,
unsigned  Index 
)
static

◆ expandStringLiteral()

static void expandStringLiteral ( EvalInfo &  Info,
const StringLiteral S,
APValue Result,
QualType  AllocType = QualType() 
)
static

◆ extractStringLiteralCharacter()

static APSInt extractStringLiteralCharacter ( EvalInfo &  Info,
const Expr Lit,
uint64_t  Index 
)
static

Extract the value of a character from a string literal.

Definition at line 3496 of file ExprConstant.cpp.

References clang::ArrayType::getElementType(), clang::Type::isIntegerType(), and clang::Type::isUnsignedIntegerType().

Referenced by handleLValueToRValueConversion().

◆ extractSubobject()

static bool extractSubobject ( EvalInfo &  Info,
const Expr E,
const CompleteObject &  Obj,
const SubobjectDesignator &  Sub,
APValue Result,
AccessKinds  AK = AK_Read 
)
static

Extract the designated sub-object of an rvalue.

Definition at line 3985 of file ExprConstant.cpp.

References clang::AK_Read, clang::AK_ReadObjectRepresentation, E, and findSubobject().

Referenced by handleLValueToRValueConversion().

◆ FastEvaluateAsRValue()

static bool FastEvaluateAsRValue ( const Expr Exp,
Expr::EvalResult Result,
const ASTContext Ctx,
bool IsConst 
)
static

◆ findCompleteObject()

static CompleteObject findCompleteObject ( EvalInfo &  Info,
const Expr E,
AccessKinds  AK,
const LValue &  LVal,
QualType  LValType 
)
static

◆ FindDesignatorMismatch()

static unsigned FindDesignatorMismatch ( QualType  ObjType,
const SubobjectDesignator &  A,
const SubobjectDesignator &  B,
bool WasArrayIndex 
)
static

Find the position where two subobject designators diverge, or equivalently the length of the common initial subsequence.

Definition at line 4053 of file ExprConstant.cpp.

References clang::Type::castAs(), clang::Type::castAsArrayTypeUnsafe(), clang::ArrayType::getElementType(), clang::Type::isAnyComplexType(), clang::Type::isArrayType(), and clang::QualType::isNull().

Referenced by AreElementsOfSameArray(), and EvaluateComparisonBinaryOperator().

◆ findSubobject()

template<typename SubobjectHandler >
SubobjectHandler::result_type findSubobject ( EvalInfo &  Info,
const Expr E,
const CompleteObject &  Obj,
const SubobjectDesignator &  Sub,
SubobjectHandler &  handler 
)

Find the designated sub-object of an rvalue.

Definition at line 3736 of file ExprConstant.cpp.

References clang::AK_Construct, clang::Type::castAs(), CheckArraySize(), diagnoseMutableFields(), E, expandArray(), clang::APValue::getArrayFiller(), clang::APValue::getArrayInitializedElt(), clang::APValue::getArrayInitializedElts(), clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), getBaseIndex(), clang::FieldDecl::getCanonicalDecl(), clang::QualType::getCanonicalType(), clang::APValue::getComplexFloatImag(), clang::APValue::getComplexFloatReal(), clang::APValue::getComplexIntImag(), clang::APValue::getComplexIntReal(), clang::ComplexType::getElementType(), clang::ArrayType::getElementType(), clang::Expr::getExprLoc(), clang::Decl::getLocation(), clang::ConstantArrayType::getSize(), clang::Stmt::getSourceRange(), clang::APValue::getStructBase(), clang::APValue::getStructField(), getSubobjectType(), clang::APValue::getUnionField(), clang::APValue::getUnionValue(), clang::APValue::getVectorElt(), clang::APValue::isAbsent(), clang::Type::isAnyComplexType(), clang::Type::isArrayType(), clang::FieldDecl::isBitField(), clang::APValue::isComplexFloat(), clang::APValue::isComplexInt(), clang::QualType::isConstQualified(), isFormalAccess(), clang::APValue::isIndeterminate(), isModification(), isRead(), clang::Type::isRecordType(), clang::TagDecl::isUnion(), isValidIndeterminateAccess(), clang::QualType::isVolatileQualified(), Loc, clang::QualType::removeLocalConst(), clang::QualType::removeLocalVolatile(), clang::APValue::setUnion(), and truncateBitfieldValue().

Referenced by checkDynamicType(), extractSubobject(), handleCompoundAssignment(), HandleDestruction(), handleIncDec(), MaybeHandleUnionActiveMemberChange(), and modifySubobject().

◆ getActiveRoundingMode()

static llvm::RoundingMode getActiveRoundingMode ( EvalInfo &  Info,
const Expr E 
)
static

Get rounding mode to use in evaluation of the specified expression.

If rounding mode is unknown at compile time, still try to evaluate the expression. If the result is exact, it does not depend on rounding mode. So return "tonearest" mode instead of "dynamic".

Definition at line 2683 of file ExprConstant.cpp.

References E, clang::Expr::getFPFeaturesInEffect(), and clang::FPOptions::getRoundingMode().

Referenced by handleFloatFloatBinOp(), HandleFloatToFloatCast(), and HandleIntToFloatCast().

◆ getAlignmentArgument()

static bool getAlignmentArgument ( const Expr E,
QualType  ForType,
EvalInfo &  Info,
APSInt Alignment 
)
static

Evaluate the value of the alignment argument to __builtin_align_{up,down}, __builtin_is_aligned and __builtin_assume_aligned.

Definition at line 9572 of file ExprConstant.cpp.

References E, and EvaluateInteger().

Referenced by getBuiltinAlignArguments().

◆ GetAlignOfExpr()

static CharUnits GetAlignOfExpr ( EvalInfo &  Info,
const Expr E,
UnaryExprOrTypeTrait  ExprKind 
)
static

Definition at line 9541 of file ExprConstant.cpp.

References E, GetAlignOfType(), clang::Expr::getType(), and clang::Expr::IgnoreParens().

Referenced by getBaseAlignment().

◆ GetAlignOfType()

static CharUnits GetAlignOfType ( EvalInfo &  Info,
QualType  T,
UnaryExprOrTypeTrait  ExprKind 
)
static

Definition at line 9515 of file ExprConstant.cpp.

References clang::CharUnits::One(), and clang::T.

Referenced by GetAlignOfExpr(), and getBaseAlignment().

◆ getBaseAlignment()

static CharUnits getBaseAlignment ( EvalInfo &  Info,
const LValue &  Value 
)
static

Definition at line 9562 of file ExprConstant.cpp.

References E, GetAlignOfExpr(), and GetAlignOfType().

◆ getBaseClassType()

static const CXXRecordDecl * getBaseClassType ( SubobjectDesignator &  Designator,
unsigned  PathLength 
)
static

Definition at line 5865 of file ExprConstant.cpp.

Referenced by ComputeDynamicType(), HandleDynamicCast(), and HandleVirtualDispatch().

◆ getBaseIndex()

static unsigned getBaseIndex ( const CXXRecordDecl Derived,
const CXXRecordDecl Base 
)
static

Get the base index of the given base class within an APValue representing the given derived class.

Definition at line 3482 of file ExprConstant.cpp.

References clang::CXXRecordDecl::bases_begin(), clang::CXXRecordDecl::bases_end(), and E.

Referenced by findSubobject().

◆ getBuiltinAlignArguments()

static bool getBuiltinAlignArguments ( const CallExpr E,
EvalInfo &  Info,
APValue Val,
APSInt Alignment 
)
static

◆ getBytesReturnedByAllocSizeCall() [1/2]

static bool getBytesReturnedByAllocSizeCall ( const ASTContext Ctx,
const CallExpr Call,
llvm::APInt &  Result 
)
static

Attempts to compute the number of bytes available at the pointer returned by a function with the alloc_size attribute.

Returns true if we were successful. Places an unsigned number into Result.

This expects the given CallExpr to be a call to a function with an alloc_size attribute.

Definition at line 9073 of file ExprConstant.cpp.

References clang::Call, E, clang::Expr::EvaluateAsInt(), clang::ASTContext::getSizeType(), clang::ASTContext::getTypeSize(), and clang::Expr::SE_AllowSideEffects.

Referenced by determineEndOffset(), and getBytesReturnedByAllocSizeCall().

◆ getBytesReturnedByAllocSizeCall() [2/2]

static bool getBytesReturnedByAllocSizeCall ( const ASTContext Ctx,
const LValue &  LVal,
llvm::APInt &  Result 
)
static

Convenience function.

LVal's base must be a call to an alloc_size function.

Definition at line 9120 of file ExprConstant.cpp.

References getBytesReturnedByAllocSizeCall().

◆ GetLValueBaseDecl()

static const ValueDecl * GetLValueBaseDecl ( const LValue &  LVal)
static

Definition at line 2137 of file ExprConstant.cpp.

Referenced by IsWeakLValue(), and isZeroSized().

◆ getObjectType()

static QualType getObjectType ( APValue::LValueBase  B)
static

◆ getSubobjectType()

static QualType getSubobjectType ( QualType  ObjType,
QualType  SubobjType,
bool  IsMutable = false 
)
static

◆ getVirtualOperatorDelete()

static const FunctionDecl * getVirtualOperatorDelete ( QualType  T)
static

Definition at line 6945 of file ExprConstant.cpp.

References clang::Type::getAsCXXRecordDecl(), and clang::T.

◆ handleAssignment()

static bool handleAssignment ( EvalInfo &  Info,
const Expr E,
const LValue &  LVal,
QualType  LValType,
APValue Val 
)
static

Perform an assignment of Val to LVal. Takes ownership of Val.

Definition at line 4473 of file ExprConstant.cpp.

References clang::AK_Assign, E, findCompleteObject(), and modifySubobject().

Referenced by HandleFunctionCall().

◆ HandleBaseToDerivedCast()

static bool HandleBaseToDerivedCast ( EvalInfo &  Info,
const CastExpr E,
LValue &  Result 
)
static

HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on the provided lvalue, which currently refers to the base object.

Definition at line 4915 of file ExprConstant.cpp.

References CastToDerivedClass(), clang::CSK_Derived, D, E, clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::CXXRecordDecl::getCanonicalDecl(), clang::Type::getPointeeType(), and clang::Expr::getType().

◆ HandleClassZeroInitialization()

static bool HandleClassZeroInitialization ( EvalInfo &  Info,
const Expr E,
const RecordDecl RD,
const LValue &  This,
APValue Result 
)
static

Perform zero-initialization on an object of non-union class type.

C++11 [dcl.init]p5: To zero-initialize an object or reference of type T means: [...] – if T is a (possibly cv-qualified) non-union class type, each non-static data member and each base-class subobject is zero-initialized

Definition at line 10342 of file ExprConstant.cpp.

References clang::CXXRecordDecl::bases_begin(), clang::CXXRecordDecl::bases_end(), E, EvaluateInPlace(), clang::RecordDecl::field_begin(), clang::RecordDecl::field_end(), clang::RecordDecl::fields(), clang::CXXRecordDecl::getNumBases(), HandleClassZeroInitialization(), HandleLValueDirectBase(), HandleLValueMember(), clang::Decl::isInvalidDecl(), and clang::TagDecl::isUnion().

Referenced by HandleClassZeroInitialization().

◆ handleCompareOpForVector()

static bool handleCompareOpForVector ( const APValue LHSValue,
BinaryOperatorKind  Opcode,
const APValue RHSValue,
APInt &  Result 
)
static

◆ handleCompareOpForVectorHelper()

template<typename APTy >
static bool handleCompareOpForVectorHelper ( const APTy &  LHSValue,
BinaryOperatorKind  Opcode,
const APTy &  RHSValue,
APInt &  Result 
)
static

Definition at line 3017 of file ExprConstant.cpp.

Referenced by handleCompareOpForVector().

◆ HandleComplexComplexDiv()

void HandleComplexComplexDiv ( APFloat  A,
APFloat  B,
APFloat  C,
APFloat  D,
APFloat &  ResR,
APFloat &  ResI 
)

Definition at line 15436 of file ExprConstant.cpp.

References abs(), clang::C, D, ilogb, and scalbn.

Referenced by clang::interp::Divc().

◆ HandleComplexComplexMul()

void HandleComplexComplexMul ( APFloat  A,
APFloat  B,
APFloat  C,
APFloat  D,
APFloat &  ResR,
APFloat &  ResI 
)

Definition at line 15380 of file ExprConstant.cpp.

References clang::C, and D.

Referenced by clang::interp::Mulc().

◆ handleCompoundAssignment()

static bool handleCompoundAssignment ( EvalInfo &  Info,
const CompoundAssignOperator E,
const LValue &  LVal,
QualType  LValType,
QualType  PromotedLValType,
BinaryOperatorKind  Opcode,
const APValue RVal 
)
static

Perform a compound assignment of LVal <op>= RVal.

Definition at line 4617 of file ExprConstant.cpp.

References clang::AK_Assign, E, findCompleteObject(), and findSubobject().

◆ HandleConstructorCall() [1/2]

static bool HandleConstructorCall ( const Expr E,
const LValue &  This,
ArrayRef< const Expr * >  Args,
const CXXConstructorDecl Definition,
EvalInfo &  Info,
APValue Result 
)
static

◆ HandleConstructorCall() [2/2]

static bool HandleConstructorCall ( const Expr E,
const LValue &  This,
CallRef  Call,
const CXXConstructorDecl Definition,
EvalInfo &  Info,
APValue Result 
)
static

◆ HandleConversionToBool()

static bool HandleConversionToBool ( const APValue Val,
bool Result 
)
static

◆ HandleCovariantReturnAdjustment()

static bool HandleCovariantReturnAdjustment ( EvalInfo &  Info,
const Expr E,
APValue Result,
ArrayRef< QualType Path 
)
static

Perform the adjustment from a value returned by a virtual function to a value of the statically expected type, which may be a pointer or reference to a base class of the returned type.

Definition at line 5997 of file ExprConstant.cpp.

References CastToBaseClass(), E, and Path.

◆ handleDefaultInitValue()

static bool handleDefaultInitValue ( QualType  T,
APValue Result 
)
static

Get the value to use for a default-initialized object of type T.

Return false if it encounters something invalid.

Definition at line 4953 of file ExprConstant.cpp.

References clang::Type::getAsArrayTypeUnsafe(), clang::Type::getAsCXXRecordDecl(), handleDefaultInitValue(), clang::APValue::IndeterminateValue(), clang::Success, and clang::T.

Referenced by clang::VarDecl::evaluateDestruction(), EvaluateVarDecl(), HandleConstructorCall(), and handleDefaultInitValue().

◆ HandleDestruction() [1/2]

static bool HandleDestruction ( EvalInfo &  Info,
const Expr E,
const LValue &  This,
QualType  ThisType 
)
static

Perform a destructor or pseudo-destructor call on the given object, which might in general not be a complete object.

Definition at line 6854 of file ExprConstant.cpp.

References clang::AK_Destroy, E, findCompleteObject(), and findSubobject().

Referenced by EvaluateDestruction().

◆ HandleDestruction() [2/2]

static bool HandleDestruction ( EvalInfo &  Info,
SourceLocation  Loc,
APValue::LValueBase  LVBase,
APValue Value,
QualType  T 
)
static

Destroy and end the lifetime of the given complete object.

Definition at line 6862 of file ExprConstant.cpp.

References HandleDestructionImpl(), Loc, and clang::T.

◆ HandleDestructionImpl()

static bool HandleDestructionImpl ( EvalInfo &  Info,
SourceRange  CallRange,
const LValue &  This,
APValue Value,
QualType  T 
)
static

◆ HandleDynamicCast()

static bool HandleDynamicCast ( EvalInfo &  Info,
const ExplicitCastExpr E,
LValue &  Ptr 
)
static

Apply the given dynamic cast operation on the provided lvalue.

This implements the hard case of dynamic_cast, requiring a "runtime check" to find a suitable target subobject.

Definition at line 6038 of file ExprConstant.cpp.

References clang::AK_DynamicCast, clang::AS_public, clang::C, CastToDerivedClass(), clang::Class, ComputeDynamicType(), D, clang::declaresSameEntity(), E, getBaseClassType(), clang::Expr::getType(), clang::QualType::getUnqualifiedType(), HandleLValueBase(), isBaseClassPublic(), clang::Expr::isGLValue(), and clang::Type::isVoidPointerType().

◆ handleFloatFloatBinOp()

static bool handleFloatFloatBinOp ( EvalInfo &  Info,
const BinaryOperator E,
APFloat &  LHS,
BinaryOperatorKind  Opcode,
const APFloat &  RHS 
)
static

Perform the given binary floating-point operation, in-place, on LHS.

Definition at line 2939 of file ExprConstant.cpp.

References checkFloatingPointResult(), E, and getActiveRoundingMode().

Referenced by handleVectorVectorBinOp().

◆ HandleFloatToFloatCast()

static bool HandleFloatToFloatCast ( EvalInfo &  Info,
const Expr E,
QualType  SrcType,
QualType  DestType,
APFloat &  Result 
)
static

Definition at line 2732 of file ExprConstant.cpp.

References checkFloatingPointResult(), E, and getActiveRoundingMode().

Referenced by handleVectorElementCast().

◆ HandleFloatToIntCast()

static bool HandleFloatToIntCast ( EvalInfo &  Info,
const Expr E,
QualType  SrcType,
const APFloat &  Value,
QualType  DestType,
APSInt Result 
)
static

◆ HandleFunctionCall()

static bool HandleFunctionCall ( SourceLocation  CallLoc,
const FunctionDecl Callee,
const LValue *  This,
const Expr E,
ArrayRef< const Expr * >  Args,
CallRef  Call,
const Stmt Body,
EvalInfo &  Info,
APValue Result,
const LValue *  ResultSlot 
)
static

◆ handleIncDec()

static bool handleIncDec ( EvalInfo &  Info,
const Expr E,
const LValue &  LVal,
QualType  LValType,
bool  IsIncrement,
APValue Old 
)
static

Perform an increment or decrement on LVal.

Definition at line 4767 of file ExprConstant.cpp.

References clang::AK_Decrement, clang::AK_Increment, E, findCompleteObject(), and findSubobject().

◆ handleIntIntBinOp()

static bool handleIntIntBinOp ( EvalInfo &  Info,
const BinaryOperator E,
const APSInt LHS,
BinaryOperatorKind  Opcode,
APSInt  RHS,
APSInt Result 
)
static

Perform the given binary integer operation.

Definition at line 2820 of file ExprConstant.cpp.

References CheckedIntArithmetic(), E, clang::Stmt::getSourceRange(), clang::Expr::getType(), and HandleOverflow().

Referenced by handleVectorVectorBinOp().

◆ HandleIntToFloatCast()

static bool HandleIntToFloatCast ( EvalInfo &  Info,
const Expr E,
const FPOptions  FPO,
QualType  SrcType,
const APSInt Value,
QualType  DestType,
APFloat &  Result 
)
static

Definition at line 2761 of file ExprConstant.cpp.

References checkFloatingPointResult(), E, and getActiveRoundingMode().

Referenced by handleVectorElementCast().

◆ HandleIntToIntCast()

static APSInt HandleIntToIntCast ( EvalInfo &  Info,
const Expr E,
QualType  DestType,
QualType  SrcType,
const APSInt Value 
)
static

◆ HandleLambdaCapture()

static bool HandleLambdaCapture ( EvalInfo &  Info,
const Expr E,
LValue &  Result,
const CXXMethodDecl MD,
const FieldDecl FD,
bool  LValueToRValueConversion 
)
static

◆ handleLogicalOpForVector() [1/3]

static bool handleLogicalOpForVector ( const APFloat &  LHSValue,
BinaryOperatorKind  Opcode,
const APFloat &  RHSValue,
APInt &  Result 
)
static

Definition at line 2990 of file ExprConstant.cpp.

◆ handleLogicalOpForVector() [2/3]

static bool handleLogicalOpForVector ( const APInt &  LHSValue,
BinaryOperatorKind  Opcode,
const APInt &  RHSValue,
APInt &  Result 
)
static

Definition at line 2978 of file ExprConstant.cpp.

Referenced by handleLogicalOpForVector(), and handleVectorVectorBinOp().

◆ handleLogicalOpForVector() [3/3]

static bool handleLogicalOpForVector ( const APValue LHSValue,
BinaryOperatorKind  Opcode,
const APValue RHSValue,
APInt &  Result 
)
static

◆ HandleLValueArrayAdjustment() [1/2]

static bool HandleLValueArrayAdjustment ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
QualType  EltTy,
APSInt  Adjustment 
)
static

Update a pointer value to model pointer arithmetic.

Parameters
Info- Information about the ongoing evaluation.
E- The expression being evaluated, for diagnostic purposes.
LVal- The pointer value to be updated.
EltTy- The pointee type represented by LVal.
Adjustment- The adjustment, in objects of type EltTy, to add.

Definition at line 3296 of file ExprConstant.cpp.

References E, clang::Expr::getExprLoc(), and HandleSizeof().

Referenced by EvaluateBuiltinStrLen(), clang::Expr::EvaluateCharRangeAsString(), HandleDestructionImpl(), and HandleLValueArrayAdjustment().

◆ HandleLValueArrayAdjustment() [2/2]

static bool HandleLValueArrayAdjustment ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
QualType  EltTy,
int64_t  Adjustment 
)
static

Definition at line 3307 of file ExprConstant.cpp.

References E, and HandleLValueArrayAdjustment().

◆ HandleLValueBase()

static bool HandleLValueBase ( EvalInfo &  Info,
const Expr E,
LValue &  Obj,
const CXXRecordDecl DerivedDecl,
const CXXBaseSpecifier Base 
)
static

◆ HandleLValueBasePath()

static bool HandleLValueBasePath ( EvalInfo &  Info,
const CastExpr E,
QualType  Type,
LValue &  Result 
)
static

Definition at line 3202 of file ExprConstant.cpp.

References E, clang::Type::getAsCXXRecordDecl(), and HandleLValueBase().

◆ HandleLValueComplexElement()

static bool HandleLValueComplexElement ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
QualType  EltTy,
bool  Imag 
)
static

Update an lvalue to refer to a component of a complex number.

Parameters
Info- Information about the ongoing evaluation.
LVal- The lvalue to be updated.
EltTy- The complex number's component type.
Imag- False for the real component, true for the imaginary.

Definition at line 3319 of file ExprConstant.cpp.

References E, clang::Expr::getExprLoc(), and HandleSizeof().

◆ HandleLValueDirectBase()

static bool HandleLValueDirectBase ( EvalInfo &  Info,
const Expr E,
LValue &  Obj,
const CXXRecordDecl Derived,
const CXXRecordDecl Base,
const ASTRecordLayout RL = nullptr 
)
static

◆ HandleLValueIndirectMember()

static bool HandleLValueIndirectMember ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
const IndirectFieldDecl IFD 
)
static

Update LVal to refer to the given indirect field.

Definition at line 3247 of file ExprConstant.cpp.

References clang::C, clang::IndirectFieldDecl::chain(), E, and HandleLValueMember().

Referenced by HandleMemberPointerAccess().

◆ HandleLValueMember()

static bool HandleLValueMember ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
const FieldDecl FD,
const ASTRecordLayout RL = nullptr 
)
static

Update LVal to refer to the given field, which must be a member of the type currently described by LVal.

Definition at line 3232 of file ExprConstant.cpp.

References E, clang::FieldDecl::getFieldIndex(), clang::FieldDecl::getParent(), and clang::Decl::isInvalidDecl().

Referenced by HandleClassZeroInitialization(), HandleConstructorCall(), HandleDestructionImpl(), HandleLambdaCapture(), HandleLValueIndirectMember(), and HandleMemberPointerAccess().

◆ handleLValueToRValueConversion()

static bool handleLValueToRValueConversion ( EvalInfo &  Info,
const Expr Conv,
QualType  Type,
const LValue &  LVal,
APValue RVal,
bool  WantObjectRepresentation = false 
)
static

Perform an lvalue-to-rvalue conversion on the given glvalue.

This can also be used for 'lvalue-to-lvalue' conversions for looking up the glvalue referred to by an entity of reference type.

Parameters
Info- Information about the ongoing evaluation.
Conv- The expression for which we are performing the conversion. Used for diagnostics.
Type- The type of the glvalue (before stripping cv-qualifiers in the case of a non-class type).
LVal- The glvalue on which we are attempting to perform this action.
RVal- The produced value will be placed here.
WantObjectRepresentation- If true, we're looking for the object representation rather than the value, and in particular, there is no requirement that the result be fully initialized.

Definition at line 4393 of file ExprConstant.cpp.

References clang::AK_Read, clang::AK_ReadObjectRepresentation, Evaluate(), extractStringLiteralCharacter(), extractSubobject(), findCompleteObject(), clang::Type::isArrayType(), and clang::QualType::isConstant().

Referenced by EvaluateAsRValue(), EvaluateBuiltinStrLen(), clang::Expr::EvaluateCharRangeAsString(), HandleLambdaCapture(), and handleTrivialCopy().

◆ HandleLValueVectorElement()

static bool HandleLValueVectorElement ( EvalInfo &  Info,
const Expr E,
LValue &  LVal,
QualType  EltTy,
uint64_t  Size,
uint64_t  Idx 
)
static

Definition at line 3332 of file ExprConstant.cpp.

References E, clang::Expr::getExprLoc(), and HandleSizeof().

◆ HandleMemberPointerAccess() [1/2]

static const ValueDecl * HandleMemberPointerAccess ( EvalInfo &  Info,
const BinaryOperator BO,
LValue &  LV,
bool  IncludeMember = true 
)
static

◆ HandleMemberPointerAccess() [2/2]

static const ValueDecl * HandleMemberPointerAccess ( EvalInfo &  Info,
QualType  LVType,
LValue &  LV,
const Expr RHS,
bool  IncludeMember = true 
)
static

HandleMemberPointerAccess - Evaluate a member access operation and build an lvalue referring to the result.

Parameters
Info- Information about the ongoing evaluation.
LV- An lvalue referring to the base of the member pointer.
RHS- The member pointer expression.
IncludeMember- Specifies whether the member itself is included in the resulting LValue subobject designator. This is not possible when creating a bound member function.
Returns
The field or method declaration to which the member pointer refers, or 0 if evaluation fails.

Definition at line 4813 of file ExprConstant.cpp.

References CastToDerivedClass(), EvaluateMemberPointer(), clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::CXXRecordDecl::getCanonicalDecl(), clang::Type::getPointeeType(), HandleLValueDirectBase(), HandleLValueIndirectMember(), and HandleLValueMember().

Referenced by HandleMemberPointerAccess().

◆ HandleOperatorDeleteCall()

bool HandleOperatorDeleteCall ( EvalInfo &  Info,
const CallExpr E 
)

◆ HandleOperatorNewCall()

static bool HandleOperatorNewCall ( EvalInfo &  Info,
const CallExpr E,
LValue &  Result 
)
static

◆ HandleOverflow()

template<typename T >
static bool HandleOverflow ( EvalInfo &  Info,
const Expr E,
const T &  SrcValue,
QualType  DestType 
)
static

Definition at line 2656 of file ExprConstant.cpp.

References E.

Referenced by CheckedIntArithmetic(), HandleFloatToIntCast(), and handleIntIntBinOp().

◆ HandleSizeof()

static bool HandleSizeof ( EvalInfo &  Info,
SourceLocation  Loc,
QualType  Type,
CharUnits Size,
SizeOfType  SOT = SizeOfType::SizeOf 
)
static

◆ handleTrivialCopy()

static bool handleTrivialCopy ( EvalInfo &  Info,
const ParmVarDecl Param,
const Expr E,
APValue Result,
bool  CopyObjectRepresentation 
)
static

Perform a trivial copy from Param, which is the parameter of a copy or move constructor or assignment operator.

Definition at line 6353 of file ExprConstant.cpp.

References E, clang::QualType::getNonReferenceType(), clang::ValueDecl::getType(), and handleLValueToRValueConversion().

Referenced by HandleConstructorCall(), and HandleFunctionCall().

◆ handleVectorElementCast()

static bool handleVectorElementCast ( EvalInfo &  Info,
const FPOptions  FPO,
const Expr E,
QualType  SourceTy,
QualType  DestTy,
APValue const &  Original,
APValue Result 
)
static

◆ handleVectorShuffle()

static bool handleVectorShuffle ( EvalInfo &  Info,
const ShuffleVectorExpr E,
QualType  ElemType,
APValue const &  VecVal1,
APValue const &  VecVal2,
unsigned  EltNum,
APValue Result 
)
static

◆ handleVectorUnaryOperator()

static std::optional< APValue > handleVectorUnaryOperator ( ASTContext Ctx,
QualType  ResultTy,
UnaryOperatorKind  Op,
APValue  Elt 
)
static

◆ handleVectorVectorBinOp()

static bool handleVectorVectorBinOp ( EvalInfo &  Info,
const BinaryOperator E,
BinaryOperatorKind  Opcode,
APValue LHSValue,
const APValue RHSValue 
)
static

◆ HandleVirtualDispatch()

static const CXXMethodDecl * HandleVirtualDispatch ( EvalInfo &  Info,
const Expr E,
LValue &  This,
const CXXMethodDecl Found,
llvm::SmallVectorImpl< QualType > &  CovariantAdjustmentPath 
)
static

◆ HasSameBase()

static bool HasSameBase ( const LValue &  A,
const LValue &  B 
)
static

Definition at line 2164 of file ExprConstant.cpp.

Referenced by EvaluateComparisonBinaryOperator().

◆ hasUnacceptableSideEffect()

static bool hasUnacceptableSideEffect ( Expr::EvalStatus Result,
Expr::SideEffectsKind  SEK 
)
static

◆ hasVirtualDestructor()

static bool hasVirtualDestructor ( QualType  T)
static

Definition at line 6938 of file ExprConstant.cpp.

References clang::Type::getAsCXXRecordDecl(), and clang::T.

◆ ignorePointerCastsAndParens()

static const Expr * ignorePointerCastsAndParens ( const Expr E)
static

A more selective version of E->IgnoreParenCasts for tryEvaluateBuiltinObjectSize.

This ignores some casts/parens that serve only to change the type of E. Ex. For E = (short*)((char*)(&foo)), returns &foo

Always returns an RValue with a pointer representation.

Definition at line 12159 of file ExprConstant.cpp.

References E, clang::Expr::getType(), clang::Type::hasPointerRepresentation(), clang::Expr::IgnoreParens(), ignorePointerCastsAndParens(), and clang::Expr::isPRValue().

Referenced by ignorePointerCastsAndParens(), and tryEvaluateBuiltinObjectSize().

◆ isAnyAccess()

static bool isAnyAccess ( AccessKinds  AK)
static

Definition at line 1546 of file ExprConstant.cpp.

References isModification(), and isRead().

Referenced by findCompleteObject(), and isFormalAccess().

◆ isBaseClassPublic()

static bool isBaseClassPublic ( const CXXRecordDecl Derived,
const CXXRecordDecl Base 
)
static

Determine whether Base, which is known to be a direct base class of Derived, is a public base class.

Definition at line 6024 of file ExprConstant.cpp.

References clang::AS_public, clang::CXXRecordDecl::bases(), and clang::declaresSameEntity().

Referenced by HandleDynamicCast().

◆ IsDeclSourceLocationCurrent()

static bool IsDeclSourceLocationCurrent ( const FunctionDecl FD)
static

◆ isDesignatorAtObjectEnd()

static bool isDesignatorAtObjectEnd ( const ASTContext Ctx,
const LValue &  LVal 
)
static

Checks to see if the given LValue's Designator is at the end of the LValue's record layout.

e.g. struct { struct { int a, b; } fst, snd; } obj; obj.fst // no obj.snd // yes obj.fst.a // no obj.fst.b // no obj.snd.a // no obj.snd.b // yes

Please note: this function is specialized for how __builtin_object_size views "objects".

If this encounters an invalid RecordDecl or otherwise cannot determine the correct result, it will always return true.

Definition at line 12195 of file ExprConstant.cpp.

References clang::Type::castAs(), E, clang::ASTContext::getAsArrayType(), clang::ASTContext::getASTRecordLayout(), clang::ArrayType::getElementType(), clang::ASTRecordLayout::getFieldCount(), clang::FieldDecl::getFieldIndex(), clang::FieldDecl::getParent(), getPointeeType(), clang::ValueDecl::getType(), clang::ConstantArrayType::getZExtSize(), clang::Invalid, clang::Type::isAnyComplexType(), clang::Type::isArrayType(), clang::Type::isIncompleteArrayType(), and Parent.

Referenced by isUserWritingOffTheEnd().

◆ isFormalAccess()

static bool isFormalAccess ( AccessKinds  AK)
static

Is this an access per the C++ definition?

Definition at line 1551 of file ExprConstant.cpp.

References clang::AK_Construct, clang::AK_Destroy, and isAnyAccess().

Referenced by findCompleteObject(), and findSubobject().

◆ IsGlobalLValue()

static bool IsGlobalLValue ( APValue::LValueBase  B)
static

◆ IsLiteralLValue()

static bool IsLiteralLValue ( const LValue &  Value)
static

Definition at line 2141 of file ExprConstant.cpp.

References E.

Referenced by EvaluateComparisonBinaryOperator().

◆ isModification()

static bool isModification ( AccessKinds  AK)
static

◆ IsNoOpCall()

static bool IsNoOpCall ( const CallExpr E)
static

Should this call expression be treated as a no-op?

Definition at line 2061 of file ExprConstant.cpp.

References E.

Referenced by IsGlobalLValue().

◆ isOneByteCharacterType()

static bool isOneByteCharacterType ( QualType  T)
static

◆ isOnePastTheEndOfCompleteObject()

static bool isOnePastTheEndOfCompleteObject ( const ASTContext Ctx,
const LValue &  LV 
)
static

Determine whether this is a pointer past the end of the complete object referred to by the lvalue.

Definition at line 13327 of file ExprConstant.cpp.

References clang::ASTContext::getTypeSizeInChars(), and clang::Type::isIncompleteType().

Referenced by EvaluateComparisonBinaryOperator().

◆ isRead()

static bool isRead ( AccessKinds  AK)
static

◆ isReadByLvalueToRvalueConversion() [1/2]

static bool isReadByLvalueToRvalueConversion ( const CXXRecordDecl RD)
static

Determine whether a type would actually be read by an lvalue-to-rvalue conversion.

If it's of class type, we may assume that the copy operation is trivial. Note that this is never true for a union type with fields (because the copy always "reads" the active member) and always true for a non-class type.

Definition at line 3581 of file ExprConstant.cpp.

References clang::CXXRecordDecl::bases(), clang::RecordDecl::field_empty(), clang::RecordDecl::fields(), clang::CXXRecordDecl::isEmpty(), isReadByLvalueToRvalueConversion(), and clang::TagDecl::isUnion().

Referenced by diagnoseMutableFields(), HandleConstructorCall(), HandleFunctionCall(), and isReadByLvalueToRvalueConversion().

◆ isReadByLvalueToRvalueConversion() [2/2]

static bool isReadByLvalueToRvalueConversion ( QualType  T)
static

◆ isUserWritingOffTheEnd()

static bool isUserWritingOffTheEnd ( const ASTContext Ctx,
const LValue &  LVal 
)
static

Attempts to detect a user writing into a piece of memory that's impossible to figure out the size of by just using types.

Definition at line 12287 of file ExprConstant.cpp.

References clang::ASTContext::getLangOpts(), and isDesignatorAtObjectEnd().

Referenced by determineEndOffset().

◆ isValidIndeterminateAccess()

static bool isValidIndeterminateAccess ( AccessKinds  AK)
static

◆ IsWeakLValue()

static bool IsWeakLValue ( const LValue &  Value)
static

Definition at line 2148 of file ExprConstant.cpp.

References GetLValueBaseDecl().

Referenced by EvaluateComparisonBinaryOperator().

◆ isZeroSized()

static bool isZeroSized ( const LValue &  Value)
static

◆ lifetimeStartedInEvaluation()

static bool lifetimeStartedInEvaluation ( EvalInfo &  Info,
APValue::LValueBase  Base,
bool  MutableSubobject = false 
)
static

Definition at line 3636 of file ExprConstant.cpp.

References clang::Type::isReferenceType(), and clang::T.

Referenced by findCompleteObject().

◆ MaybeElementDependentArrayFiller()

static bool MaybeElementDependentArrayFiller ( const Expr FillerExpr)
static

Definition at line 11317 of file ExprConstant.cpp.

References E, and MaybeElementDependentArrayFiller().

Referenced by MaybeElementDependentArrayFiller().

◆ MaybeHandleUnionActiveMemberChange()

static bool MaybeHandleUnionActiveMemberChange ( EvalInfo &  Info,
const Expr LHSExpr,
const LValue &  LHS 
)
static

Handle a builtin simple-assignment or a call to a trivial assignment operator whose left-hand side might involve a union member access.

If it does, implicitly start the lifetime of any accessed union elements per C++20 [class.union]5.

Definition at line 6186 of file ExprConstant.cpp.

References clang::AK_Assign, D, clang::declaresSameEntity(), E, findCompleteObject(), findSubobject(), and clang::Expr::getType().

◆ modifySubobject()

static bool modifySubobject ( EvalInfo &  Info,
const Expr E,
const CompleteObject &  Obj,
const SubobjectDesignator &  Sub,
APValue NewVal 
)
static

Update the designated sub-object of an rvalue to the given value.

Definition at line 4043 of file ExprConstant.cpp.

References E, and findSubobject().

Referenced by handleAssignment().

◆ negateAsSigned()

static void negateAsSigned ( APSInt Int)
static

Negate an APSInt in place, converting it to a signed form if necessary, and preserving its value (by extending by up to one bit as needed).

Definition at line 1924 of file ExprConstant.cpp.

◆ NoDiag()

static ICEDiag NoDiag ( )
static

Definition at line 16511 of file ExprConstant.cpp.

Referenced by CheckEvalInICE(), CheckICE(), and ParseDirective().

◆ NoteLValueLocation()

static void NoteLValueLocation ( EvalInfo &  Info,
APValue::LValueBase  Base 
)
static

◆ refersToCompleteObject()

static bool refersToCompleteObject ( const LValue &  LVal)
static

Tests to see if the LValue has a user-specified designator (that isn't necessarily valid).

Note that this always returns 'true' if the LValue has an unsized array as its first designator entry, because there's currently no way to tell if the user typed *foo or foo[0].

Definition at line 12269 of file ExprConstant.cpp.

References E.

Referenced by determineEndOffset().

◆ truncateBitfieldValue()

static bool truncateBitfieldValue ( EvalInfo &  Info,
const Expr E,
APValue Value,
const FieldDecl FD 
)
static

◆ TryEvaluateBuiltinNaN()

static bool TryEvaluateBuiltinNaN ( const ASTContext Context,
QualType  ResultTy,
const Expr Arg,
bool  SNaN,
llvm::APFloat &  Result 
)
static

◆ tryEvaluateBuiltinObjectSize()

static bool tryEvaluateBuiltinObjectSize ( const Expr E,
unsigned  Type,
EvalInfo &  Info,
uint64_t &  Size 
)
static

Tries to evaluate the __builtin_object_size for E.

If successful, returns true and stores the result in Size.

If WasError is non-null, this will report whether the failure to evaluate is to be treated as an Error in IntExprEvaluator.

Definition at line 12441 of file ExprConstant.cpp.

References determineEndOffset(), E, EvaluateAsRValue(), EvaluatePointer(), clang::Expr::getExprLoc(), ignorePointerCastsAndParens(), and clang::Expr::isGLValue().

Referenced by clang::Expr::tryEvaluateObjectSize().

◆ Worst()

static ICEDiag Worst ( ICEDiag  A,
ICEDiag  B 
)
static

Definition at line 16513 of file ExprConstant.cpp.

Referenced by CheckICE().