|
clang
3.8.0
|
#include "clang/AST/APValue.h"#include "clang/AST/ASTContext.h"#include "clang/AST/ASTDiagnostic.h"#include "clang/AST/CharUnits.h"#include "clang/AST/Expr.h"#include "clang/AST/RecordLayout.h"#include "clang/AST/StmtVisitor.h"#include "clang/AST/TypeLoc.h"#include "clang/Basic/Builtins.h"#include "clang/Basic/TargetInfo.h"#include "llvm/ADT/SmallString.h"#include "llvm/Support/raw_ostream.h"#include <cstring>#include <functional>#include "clang/AST/StmtNodes.inc"Go to the source code of this file.
Classes | |
| struct | StmtResult |
| A location where the result (returned value) of evaluating a statement should be stored. More... | |
Macros | |
| #define | ABSTRACT_STMT(Node) |
| #define | STMT(Node, Base) case Expr::Node##Class: |
| #define | EXPR(Node, Base) |
Enumerations | |
| enum | CheckSubobjectKind |
| enum | AccessKinds { AK_Read, AK_Assign, AK_Increment, AK_Decrement } |
| Kinds of access we can perform on an object, for diagnostics. More... | |
| enum | EvalStmtResult |
| enum | ICEKind |
Functions | |
| static bool | IsGlobalLValue (APValue::LValueBase B) |
| static void | describeCall (CallStackFrame *Frame, raw_ostream &Out) |
| Produce a string describing the given constexpr call. More... | |
| 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. More... | |
| static bool | EvaluateLValue (const Expr *E, LValue &Result, EvalInfo &Info) |
| Evaluate an expression as an lvalue. More... | |
| static bool | EvaluatePointer (const Expr *E, LValue &Result, EvalInfo &Info) |
| 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. More... | |
| 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. More... | |
| 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, 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. More... | |
| static bool | EvaluateIgnoredValue (EvalInfo &Info, const Expr *E) |
| Evaluate an expression to see if it had side-effects, and discard its result. More... | |
| static int64_t | getExtValue (const APSInt &Value) |
| Sign- or zero-extend a value to 64 bits. More... | |
| static bool | IsStringLiteralCall (const CallExpr *E) |
| Should this call expression be treated as a string literal? More... | |
| static void | NoteLValueLocation (EvalInfo &Info, APValue::LValueBase Base) |
| static bool | CheckLValueConstantExpression (EvalInfo &Info, SourceLocation Loc, QualType Type, const LValue &LVal) |
| Check that this reference or pointer core constant expression is a valid value for an address or reference constant expression. More... | |
| 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. More... | |
| static bool | CheckConstantExpression (EvalInfo &Info, SourceLocation DiagLoc, QualType Type, const APValue &Value) |
| Check that this core constant expression value is a valid value for a constant expression. More... | |
| static const ValueDecl * | GetLValueBaseDecl (const LValue &LVal) |
| static bool | IsLiteralLValue (const LValue &Value) |
| static bool | IsWeakLValue (const LValue &Value) |
| static bool | isZeroSized (const LValue &Value) |
| 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 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, QualType SrcType, const APSInt &Value, QualType DestType, APFloat &Result) |
| static bool | truncateBitfieldValue (EvalInfo &Info, const Expr *E, APValue &Value, const FieldDecl *FD) |
| static bool | EvalAndBitcastToAPInt (EvalInfo &Info, const Expr *E, llvm::APInt &Res) |
| 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). More... | |
| static bool | handleIntIntBinOp (EvalInfo &Info, const Expr *E, const APSInt &LHS, BinaryOperatorKind Opcode, APSInt RHS, APSInt &Result) |
| Perform the given binary integer operation. More... | |
| static bool | handleFloatFloatBinOp (EvalInfo &Info, const Expr *E, APFloat &LHS, BinaryOperatorKind Opcode, const APFloat &RHS) |
| Perform the given binary floating-point operation, in-place, on LHS. More... | |
| 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. More... | |
| 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 | 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. More... | |
| static bool | HandleLValueIndirectMember (EvalInfo &Info, const Expr *E, LValue &LVal, const IndirectFieldDecl *IFD) |
| Update LVal to refer to the given indirect field. More... | |
| static bool | HandleSizeof (EvalInfo &Info, SourceLocation Loc, QualType Type, CharUnits &Size) |
| Get the size of the given type in char units. More... | |
| static bool | HandleLValueArrayAdjustment (EvalInfo &Info, const Expr *E, LValue &LVal, QualType EltTy, int64_t Adjustment) |
| Update a pointer value to model pointer arithmetic. More... | |
| 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. More... | |
| static bool | evaluateVarDeclInit (EvalInfo &Info, const Expr *E, const VarDecl *VD, CallStackFrame *Frame, APValue *&Result) |
| Try to evaluate the initializer for a variable declaration. More... | |
| static bool | IsConstNonVolatile (QualType T) |
| 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. More... | |
| static APSInt | extractStringLiteralCharacter (EvalInfo &Info, const Expr *Lit, uint64_t Index) |
| Extract the value of a character from a string literal. More... | |
| static void | expandStringLiteral (EvalInfo &Info, const Expr *Lit, APValue &Result) |
| static void | expandArray (APValue &Array, unsigned Index) |
| static bool | isReadByLvalueToRvalueConversion (QualType T) |
| Determine whether a type would actually be read by an lvalue-to-rvalue conversion. More... | |
| static bool | diagnoseUnreadableFields (EvalInfo &Info, const Expr *E, QualType T) |
| Diagnose an attempt to read from any unreadable field within the specified type, which might be a class type. More... | |
| 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. More... | |
| static bool | extractSubobject (EvalInfo &Info, const Expr *E, const CompleteObject &Obj, const SubobjectDesignator &Sub, APValue &Result) |
| Extract the designated sub-object of an rvalue. More... | |
| 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. More... | |
| 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. More... | |
| 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. More... | |
| static CompleteObject | findCompleteObject (EvalInfo &Info, const Expr *E, AccessKinds AK, const LValue &LVal, QualType LValType) |
| Find the complete object to which an LValue refers. More... | |
| static bool | handleLValueToRValueConversion (EvalInfo &Info, const Expr *Conv, QualType Type, const LValue &LVal, APValue &RVal) |
| Perform an lvalue-to-rvalue conversion on the given glvalue. More... | |
| 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. More... | |
| static bool | isOverflowingIntegerType (ASTContext &Ctx, QualType T) |
| static bool | handleCompoundAssignment (EvalInfo &Info, const Expr *E, const LValue &LVal, QualType LValType, QualType PromotedLValType, BinaryOperatorKind Opcode, const APValue &RVal) |
| Perform a compound assignment of LVal <op>= RVal. More... | |
| static bool | handleIncDec (EvalInfo &Info, const Expr *E, const LValue &LVal, QualType LValType, bool IsIncrement, APValue *Old) |
| Perform an increment or decrement on LVal. More... | |
| static bool | EvaluateObjectArgument (EvalInfo &Info, const Expr *Object, LValue &This) |
| Build an lvalue for the object argument of a member function call. More... | |
| static const ValueDecl * | HandleMemberPointerAccess (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. More... | |
| static const ValueDecl * | HandleMemberPointerAccess (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. More... | |
| static bool | EvaluateDecl (EvalInfo &Info, const Decl *D) |
| static bool | EvaluateCond (EvalInfo &Info, const VarDecl *CondDecl, const Expr *Cond, bool &Result) |
| Evaluate a condition (either a variable declaration or an expression). More... | |
| 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. More... | |
| static EvalStmtResult | EvaluateSwitch (StmtResult &Result, EvalInfo &Info, const SwitchStmt *SS) |
| Evaluate a switch statement. More... | |
| static bool | CheckTrivialDefaultConstructor (EvalInfo &Info, SourceLocation Loc, const CXXConstructorDecl *CD, bool IsValueInitialization) |
| CheckTrivialDefaultConstructor - Check whether a constructor is a trivial default constructor. More... | |
| static bool | CheckConstexprFunction (EvalInfo &Info, SourceLocation CallLoc, const FunctionDecl *Declaration, const FunctionDecl *Definition) |
| CheckConstexprFunction - Check that a function can be called in a constant expression. More... | |
| static bool | hasFields (const CXXRecordDecl *RD) |
| Determine if a class has any fields that might need to be copied by a trivial copy or move operation. More... | |
| static bool | EvaluateArgs (ArrayRef< const Expr * > Args, ArgVector &ArgValues, EvalInfo &Info) |
| EvaluateArgs - Evaluate the arguments to a function call. More... | |
| static bool | HandleFunctionCall (SourceLocation CallLoc, const FunctionDecl *Callee, const LValue *This, ArrayRef< const Expr * > Args, const Stmt *Body, EvalInfo &Info, APValue &Result, const LValue *ResultSlot) |
| Evaluate a function call. More... | |
| static bool | HandleConstructorCall (SourceLocation CallLoc, const LValue &This, ArrayRef< const Expr * > Args, const CXXConstructorDecl *Definition, EvalInfo &Info, APValue &Result) |
| Evaluate a constructor call. More... | |
| static CharUnits | GetAlignOfType (EvalInfo &Info, QualType T) |
| static CharUnits | GetAlignOfExpr (EvalInfo &Info, const Expr *E) |
| 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. More... | |
| static bool | EvaluateRecord (const Expr *E, const LValue &This, APValue &Result, EvalInfo &Info) |
| static bool | EvaluateVector (const Expr *E, APValue &Result, EvalInfo &Info) |
| static bool | EvaluateArray (const Expr *E, const LValue &This, APValue &Result, EvalInfo &Info) |
| static int | EvaluateBuiltinClassifyType (const CallExpr *E) |
| EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way as GCC. More... | |
| template<typename LValue > | |
| static bool | EvaluateBuiltinConstantPForLValue (const LValue &LV) |
| EvaluateBuiltinConstantPForLValue - Determine the result of __builtin_constant_p when applied to the given lvalue. More... | |
| static bool | EvaluateBuiltinConstantP (ASTContext &Ctx, const Expr *Arg) |
| EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to GCC as we can manage. More... | |
| static QualType | getObjectType (APValue::LValueBase B) |
| Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size. More... | |
| static const Expr * | ignorePointerCastsAndParens (const Expr *E) |
| A more selective version of E->IgnoreParenCasts for TryEvaluateBuiltinObjectSize. More... | |
| 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. More... | |
| static bool | refersToCompleteObject (const LValue &LVal) |
| Tests to see if the LValue has a designator (that isn't necessarily valid). More... | |
| static bool | tryEvaluateBuiltinObjectSize (const Expr *E, unsigned Type, EvalInfo &Info, uint64_t &Size, bool *WasError=nullptr) |
Tries to evaluate the __builtin_object_size for E. More... | |
| static bool | HasSameBase (const LValue &A, const LValue &B) |
| 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. More... | |
| static bool | TryEvaluateBuiltinNaN (const ASTContext &Context, QualType ResultTy, const Expr *Arg, bool SNaN, llvm::APFloat &Result) |
| 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 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. More... | |
| #define ABSTRACT_STMT | ( | Node | ) |
| #define STMT | ( | Node, | |
| Base | |||
| ) | case Expr::Node##Class: |
| enum AccessKinds |
Kinds of access we can perform on an object, for diagnostics.
| Enumerator | |
|---|---|
| AK_Read | |
| AK_Assign | |
| AK_Increment | |
| AK_Decrement | |
Definition at line 2239 of file ExprConstant.cpp.
| enum CheckSubobjectKind |
Definition at line 150 of file ExprConstant.cpp.
| enum EvalStmtResult |
Definition at line 3284 of file ExprConstant.cpp.
| enum ICEKind |
Definition at line 8994 of file ExprConstant.cpp.
|
static |
Determine whether the given subobject designators refer to elements of the same array object.
Definition at line 2571 of file ExprConstant.cpp.
References FindDesignatorMismatch().
|
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 1854 of file ExprConstant.cpp.
References clang::ASTRecordLayout::getBaseClassOffset(), clang::ASTRecordLayout::getVBaseClassOffset(), I, and clang::Decl::isInvalidDecl().
Referenced by HandleBaseToDerivedCast(), HandleLValueBase(), and HandleMemberPointerAccess().
|
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 1427 of file ExprConstant.cpp.
References clang::Type::castAs(), clang::Type::castAsArrayTypeUnsafe(), CheckLValueConstantExpression(), End, clang::RecordDecl::fields(), clang::APValue::getArrayFiller(), clang::APValue::getArrayInitializedElt(), clang::APValue::getArrayInitializedElts(), clang::Type::getAs(), clang::ArrayType::getElementType(), clang::APValue::getStructBase(), clang::APValue::getStructField(), clang::ValueDecl::getType(), clang::APValue::getUnionField(), clang::APValue::getUnionValue(), clang::APValue::hasArrayFiller(), I, clang::APValue::isArray(), clang::APValue::isLValue(), clang::APValue::isStruct(), clang::APValue::isUninit(), and clang::APValue::isUnion().
Referenced by clang::Expr::EvaluateAsInitializer(), and EvaluateAsRValue().
|
static |
CheckConstexprFunction - Check that a function can be called in a constant expression.
Definition at line 3737 of file ExprConstant.cpp.
References clang::Decl::getLocation(), clang::FunctionDecl::isConstexpr(), and clang::Decl::isInvalidDecl().
|
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 1703 of file ExprConstant.cpp.
References clang::Expr::getExprLoc(), clang::Expr::getType(), and HandleOverflow().
Referenced by handleIntIntBinOp().
|
static |
Definition at line 9018 of file ExprConstant.cpp.
References clang::Expr::EvaluateAsRValue(), clang::Expr::EvalStatus::HasSideEffects, clang::APValue::isInt(), NoDiag(), and clang::Expr::EvalResult::Val.
Referenced by CheckICE().
|
static |
Definition at line 9027 of file ExprConstant.cpp.
References clang::BO_Add, clang::BO_AddAssign, clang::BO_And, clang::BO_AndAssign, clang::BO_Assign, clang::BO_Comma, clang::BO_Div, clang::BO_DivAssign, clang::BO_EQ, clang::BO_GE, clang::BO_GT, clang::BO_LAnd, clang::BO_LE, clang::BO_LOr, clang::BO_LT, clang::BO_Mul, clang::BO_MulAssign, clang::BO_NE, clang::BO_Or, clang::BO_OrAssign, clang::BO_PtrMemD, clang::BO_PtrMemI, clang::BO_Rem, clang::BO_RemAssign, clang::BO_Shl, clang::BO_ShlAssign, clang::BO_Shr, clang::BO_ShrAssign, clang::BO_Sub, clang::BO_SubAssign, clang::BO_Xor, clang::BO_XorAssign, CheckEvalInICE(), clang::VarDecl::checkInitIsICE(), clang::CK_AtomicToNonAtomic, clang::CK_IntegralCast, clang::CK_IntegralToBoolean, clang::CK_LValueToRValue, clang::CK_NonAtomicToAtomic, clang::CK_NoOp, E, clang::Expr::EvaluateKnownConstInt(), clang::CallExpr::getBuiltinCallee(), clang::BinaryConditionalOperator::getCommon(), clang::ConditionalOperator::getCond(), clang::ConditionalOperator::getFalseExpr(), clang::BinaryConditionalOperator::getFalseExpr(), clang::ASTContext::getIntWidth(), clang::UnaryExprOrTypeTraitExpr::getKind(), clang::ASTContext::getLangOpts(), clang::BinaryOperator::getLHS(), clang::UnaryOperator::getOpcode(), clang::BinaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::UnaryOperator::getSubExpr(), clang::ConditionalOperator::getTrueExpr(), clang::Expr::getType(), clang::ValueDecl::getType(), clang::UnaryExprOrTypeTraitExpr::getTypeOfArgument(), clang::Expr::IgnoreParenCasts(), clang::Expr::IgnoreParenImpCasts(), IsConstNonVolatile(), clang::Type::isIntegralOrEnumerationType(), clang::Expr::isRValue(), clang::Type::isSignedIntegerOrEnumerationType(), clang::Expr::isValueDependent(), clang::Type::isVariableArrayType(), NoDiag(), clang::UETT_SizeOf, clang::UO_AddrOf, clang::UO_Coawait, clang::UO_Deref, clang::UO_Extension, clang::UO_Imag, clang::UO_LNot, clang::UO_Minus, clang::UO_Not, clang::UO_Plus, clang::UO_PostDec, clang::UO_PostInc, clang::UO_PreDec, clang::UO_PreInc, clang::UO_Real, and Worst().
Referenced by clang::Expr::isCXX98IntegralConstantExpr(), and clang::Expr::isIntegerConstantExpr().
|
static |
Check that this core constant expression is of literal type, and if not, produce an appropriate diagnostic.
Definition at line 1403 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isLiteralType(), and clang::Expr::isRValue().
Referenced by EvaluateAsRValue(), and EvaluateInPlace().
|
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 1325 of file ExprConstant.cpp.
References IsGlobalLValue(), clang::Type::isReferenceType(), and NoteLValueLocation().
Referenced by CheckConstantExpression(), and clang::Expr::EvaluateAsLValue().
|
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 3712 of file ExprConstant.cpp.
References clang::Decl::getLocation(), clang::FunctionDecl::isConstexpr(), clang::CXXConstructorDecl::isDefaultConstructor(), and clang::FunctionDecl::isTrivial().
|
static |
Produce a string describing the given constexpr call.
Definition at line 1196 of file ExprConstant.cpp.
References E, clang::ValueDecl::getType(), I, and clang::APValue::printPretty().
Diagnose an attempt to read from any unreadable field within the specified type, which might be a class type.
Definition at line 2205 of file ExprConstant.cpp.
References clang::CXXRecordDecl::bases(), clang::RecordDecl::fields(), clang::Type::getAsCXXRecordDecl(), clang::Type::getBaseElementTypeUnsafe(), clang::Expr::getType(), clang::CXXRecordDecl::hasMutableFields(), isReadByLvalueToRvalueConversion(), and clang::TagDecl::isUnion().
Referenced by findSubobject().
Definition at line 1652 of file ExprConstant.cpp.
References clang::Type::castAs(), Evaluate(), getElementType(), clang::APValue::getFloat(), clang::APValue::getInt(), clang::Expr::getType(), clang::APValue::getVectorElt(), clang::APValue::getVectorLength(), clang::APValue::isFloat(), clang::APValue::isInt(), and clang::APValue::isVector().
Definition at line 1515 of file ExprConstant.cpp.
References clang::APValue::getLValueBase(), clang::APValue::getLValueOffset(), clang::ValueDecl::isWeak(), and clang::CharUnits::isZero().
Referenced by HandleConversionToBool().
Definition at line 8701 of file ExprConstant.cpp.
References AttributeLangSupport::C, EvaluateArray(), EvaluateAtomic(), EvaluateComplex(), EvaluateFloat(), EvaluateLValue(), EvaluateMemberPointer(), EvaluatePointer(), EvaluateRecord(), EvaluateVector(), EvaluateVoid(), clang::Expr::getType(), clang::Type::hasPointerRepresentation(), clang::Type::isAnyComplexType(), clang::Type::isArrayType(), clang::Type::isAtomicType(), clang::Type::isFunctionType(), clang::Expr::isGLValue(), clang::Type::isIntegralOrEnumerationType(), clang::Type::isMemberPointerType(), clang::Type::isRealFloatingType(), clang::Type::isRecordType(), clang::Type::isVectorType(), clang::Type::isVoidType(), and P.
Referenced by EvalAndBitcastToAPInt(), EvaluateArgs(), EvaluateAsBooleanCondition(), EvaluateAsRValue(), EvaluateIgnoredValue(), EvaluateInPlace(), EvaluateStmt(), clang::Expr::EvaluateWithSubstitution(), handleLValueToRValueConversion(), and clang::Expr::isPotentialConstantExprUnevaluated().
|
static |
EvaluateArgs - Evaluate the arguments to a function call.
Definition at line 3790 of file ExprConstant.cpp.
References E, Evaluate(), and I.
Referenced by HandleConstructorCall(), HandleFunctionCall(), and clang::Expr::isPotentialConstantExprUnevaluated().
|
static |
Definition at line 5846 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isArrayType(), and clang::Expr::isRValue().
Referenced by Evaluate(), and EvaluateInPlace().
Definition at line 1564 of file ExprConstant.cpp.
References Evaluate(), HandleConversionToBool(), and clang::Expr::isRValue().
Referenced by EvaluateCond(), and EvaluateStmt().
EvaluateAsRValue - Try to evaluate this expression, performing an implicit lvalue-to-rvalue cast if it is an lvalue.
Definition at line 8796 of file ExprConstant.cpp.
References CheckConstantExpression(), CheckLiteralType(), Evaluate(), clang::Expr::getExprLoc(), clang::Expr::getType(), handleLValueToRValueConversion(), clang::Expr::isGLValue(), and clang::QualType::isNull().
Referenced by clang::Expr::EvaluateAsRValue(), and tryEvaluateBuiltinObjectSize().
Definition at line 8651 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isAtomicType(), and clang::Expr::isRValue().
Referenced by Evaluate().
|
static |
EvaluateBuiltinClassifyType - Evaluate __builtin_classify_type the same way as GCC.
Definition at line 6188 of file ExprConstant.cpp.
References clang::CallExpr::getArg(), clang::CallExpr::getNumArgs(), clang::Expr::getType(), clang::Type::isArrayType(), clang::Type::isBooleanType(), clang::Type::isCharType(), clang::Type::isComplexType(), clang::Type::isEnumeralType(), clang::Type::isFunctionType(), clang::Type::isIntegerType(), clang::Type::isPointerType(), clang::Type::isRealType(), clang::Type::isReferenceType(), clang::Type::isStructureOrClassType(), clang::Type::isUnionType(), and clang::Type::isVoidType().
|
static |
EvaluateBuiltinConstantP - Evaluate __builtin_constant_p as similarly to GCC as we can manage.
Definition at line 6254 of file ExprConstant.cpp.
References clang::Expr::EvaluateAsRValue(), EvaluateBuiltinConstantPForLValue(), EvaluateLValue(), EvaluatePointer(), clang::APValue::getKind(), clang::Expr::getType(), clang::Expr::EvalStatus::HasSideEffects, clang::Type::isAnyComplexType(), clang::Expr::isEvaluatable(), clang::Type::isFloatingType(), clang::Expr::isGLValue(), clang::Type::isIntegralOrEnumerationType(), clang::Type::isPointerType(), and clang::Expr::EvalResult::Val.
|
static |
EvaluateBuiltinConstantPForLValue - Determine the result of __builtin_constant_p when applied to the given lvalue.
An lvalue is only "constant" if it is a pointer or reference to the first character of a string literal.
Definition at line 6247 of file ExprConstant.cpp.
References E.
Referenced by EvaluateBuiltinConstantP().
Definition at line 8159 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isAnyComplexType(), and clang::Expr::isRValue().
Referenced by Evaluate().
|
static |
Evaluate a condition (either a variable declaration or an expression).
Definition at line 3333 of file ExprConstant.cpp.
References EvaluateAsBooleanCondition(), and EvaluateDecl().
Referenced by EvaluateStmt().
|
static |
Evaluate an expression as a C++11 integral constant expression.
Definition at line 9406 of file ExprConstant.cpp.
References clang::Expr::getExprLoc(), clang::APValue::getInt(), clang::Expr::getType(), clang::Expr::isCXX11ConstantExpr(), clang::APValue::isInt(), clang::Type::isIntegralOrEnumerationType(), and clang::Result.
Referenced by clang::Expr::isIntegerConstantExpr().
Definition at line 3300 of file ExprConstant.cpp.
References EvaluateInPlace(), clang::Decl::getLocStart(), and clang::Expr::isValueDependent().
Referenced by EvaluateCond(), EvaluateStmt(), and EvaluateSwitch().
Definition at line 7934 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isRealFloatingType(), and clang::Expr::isRValue().
Referenced by Evaluate().
Evaluate an expression to see if it had side-effects, and discard its result.
true if the caller should keep evaluating. Definition at line 1234 of file ExprConstant.cpp.
References Evaluate().
Referenced by EvaluateStmt().
|
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 8774 of file ExprConstant.cpp.
References CheckLiteralType(), Evaluate(), EvaluateArray(), EvaluateRecord(), clang::Expr::getType(), clang::Type::isArrayType(), clang::Type::isRecordType(), clang::Expr::isRValue(), and clang::Expr::isValueDependent().
Referenced by clang::Expr::EvaluateAsInitializer(), EvaluateDecl(), EvaluateStmt(), HandleClassZeroInitialization(), and HandleConstructorCall().
Definition at line 6145 of file ExprConstant.cpp.
References EvaluateIntegerOrLValue(), clang::APValue::getInt(), and clang::APValue::isInt().
Referenced by EvaluateSwitch().
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 6139 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isIntegralOrEnumerationType(), and clang::Expr::isRValue().
Referenced by EvaluateInteger().
|
static |
Evaluate the body of a loop, and translate the result as appropriate.
Definition at line 3355 of file ExprConstant.cpp.
References EvaluateStmt().
Referenced by EvaluateStmt().
Evaluate an expression as an lvalue.
This can be legitimately called on expressions which are not glvalues, in three cases:
Definition at line 4622 of file ExprConstant.cpp.
References E, clang::Expr::getType(), clang::Type::isFunctionType(), clang::Expr::isGLValue(), and clang::Type::isVoidType().
Referenced by Evaluate(), clang::Expr::EvaluateAsLValue(), EvaluateBuiltinConstantP(), and EvaluateObjectArgument().
Definition at line 5193 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isMemberPointerType(), and clang::Expr::isRValue().
Referenced by Evaluate(), and HandleMemberPointerAccess().
Build an lvalue for the object argument of a member function call.
Definition at line 3119 of file ExprConstant.cpp.
References EvaluateLValue(), EvaluatePointer(), EvaluateTemporary(), clang::Expr::getType(), clang::Expr::isGLValue(), clang::Type::isLiteralType(), and clang::Type::isPointerType().
Referenced by HandleMemberPointerAccess().
Definition at line 4919 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::hasPointerRepresentation(), and clang::Expr::isRValue().
Referenced by Evaluate(), EvaluateBuiltinConstantP(), EvaluateObjectArgument(), and tryEvaluateBuiltinObjectSize().
|
static |
Definition at line 5558 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isRecordType(), and clang::Expr::isRValue().
Referenced by Evaluate(), and EvaluateInPlace().
|
static |
Definition at line 3431 of file ExprConstant.cpp.
References clang::CompoundStmt::body(), clang::DeclStmt::decls(), Evaluate(), EvaluateAsBooleanCondition(), EvaluateCond(), EvaluateDecl(), EvaluateIgnoredValue(), EvaluateInPlace(), EvaluateLoopBody(), EvaluateSwitch(), clang::CXXForRangeStmt::getBeginEndStmt(), clang::CXXForRangeStmt::getBody(), clang::WhileStmt::getBody(), clang::DoStmt::getBody(), clang::ForStmt::getBody(), clang::CXXForRangeStmt::getCond(), clang::IfStmt::getCond(), clang::WhileStmt::getCond(), clang::DoStmt::getCond(), clang::ForStmt::getCond(), clang::IfStmt::getConditionVariable(), clang::WhileStmt::getConditionVariable(), clang::ForStmt::getConditionVariable(), clang::IfStmt::getElse(), clang::CXXForRangeStmt::getInc(), clang::ForStmt::getInc(), clang::ForStmt::getInit(), clang::CXXForRangeStmt::getLoopVarStmt(), clang::CXXForRangeStmt::getRangeStmt(), clang::IfStmt::getThen(), S, StmtResult::Slot, and StmtResult::Value.
Referenced by EvaluateLoopBody(), EvaluateSwitch(), HandleConstructorCall(), and HandleFunctionCall().
|
static |
Evaluate a switch statement.
Definition at line 3374 of file ExprConstant.cpp.
References EvaluateDecl(), EvaluateInteger(), clang::Expr::EvaluateKnownConstInt(), EvaluateStmt(), clang::SwitchStmt::getBody(), clang::SwitchStmt::getCond(), clang::SwitchStmt::getConditionVariable(), clang::CaseStmt::getLHS(), clang::SwitchCase::getLocStart(), clang::SwitchCase::getNextSwitchCase(), clang::CaseStmt::getRHS(), and clang::SwitchStmt::getSwitchCaseList().
Referenced by EvaluateStmt().
Evaluate an expression of record type as a temporary.
Definition at line 5611 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Type::isRecordType(), and clang::Expr::isRValue().
Referenced by EvaluateObjectArgument().
|
static |
Try to evaluate the initializer for a variable declaration.
| Info | Information about the ongoing evaluation. |
| E | An expression to be used when printing diagnostics. |
| VD | The variable whose initializer should be obtained. |
| Frame | The frame in which the variable was created. Must be null if this variable is not local to the evaluation. |
| Result | Filled in with a pointer to the value of the variable. |
Definition at line 2027 of file ExprConstant.cpp.
References clang::VarDecl::checkInitIsICE(), clang::VarDecl::evaluateValue(), clang::VarDecl::getAnyInitializer(), clang::VarDecl::getEvaluatedValue(), clang::Decl::getLocation(), clang::Expr::isValueDependent(), and clang::ValueDecl::isWeak().
Referenced by findCompleteObject().
Definition at line 5653 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Expr::isRValue(), and clang::Type::isVectorType().
Referenced by Evaluate().
Definition at line 8692 of file ExprConstant.cpp.
References clang::Expr::getType(), clang::Expr::isRValue(), and clang::Type::isVoidType().
Referenced by Evaluate().
Definition at line 2160 of file ExprConstant.cpp.
References clang::APValue::getArrayFiller(), clang::APValue::getArrayInitializedElt(), clang::APValue::getArrayInitializedElts(), clang::APValue::getArraySize(), clang::APValue::hasArrayFiller(), I, and clang::APValue::swap().
Referenced by findSubobject().
Definition at line 2137 of file ExprConstant.cpp.
References clang::APValue::getArrayFiller(), clang::APValue::getArrayInitializedElt(), clang::APValue::getArrayInitializedElts(), clang::StringLiteral::getCharByteWidth(), clang::StringLiteral::getCodeUnit(), clang::StringLiteral::getLength(), clang::Expr::getType(), clang::APValue::hasArrayFiller(), I, clang::Type::isIntegerType(), and clang::Type::isUnsignedIntegerType().
Referenced by findSubobject().
|
static |
Extract the value of a character from a string literal.
Definition at line 2117 of file ExprConstant.cpp.
References clang::StringLiteral::getCharByteWidth(), clang::StringLiteral::getCodeUnit(), clang::Expr::getType(), clang::Type::isIntegerType(), and clang::Type::isUnsignedIntegerType().
|
static |
Extract the designated sub-object of an rvalue.
Definition at line 2465 of file ExprConstant.cpp.
References findSubobject().
Referenced by handleLValueToRValueConversion().
|
static |
Definition at line 8817 of file ExprConstant.cpp.
References clang::ASTContext::getLangOpts(), clang::Expr::getType(), clang::Type::isArrayType(), clang::QualType::isNull(), clang::Type::isRecordType(), clang::Expr::isRValue(), and clang::Expr::EvalResult::Val.
Referenced by clang::Expr::EvaluateAsRValue(), and clang::Expr::EvaluateForOverflow().
|
static |
Find the complete object to which an LValue refers.
Definition at line 2591 of file ExprConstant.cpp.
References AK_Read, evaluateVarDeclInit(), clang::VarDecl::getDefinition(), clang::Expr::getExprLoc(), clang::Decl::getLocation(), clang::VarDecl::isConstexpr(), clang::QualType::isConstQualified(), clang::Type::isFloatingType(), clang::Type::isIntegralOrEnumerationType(), clang::Decl::isInvalidDecl(), clang::QualType::isVolatileQualified(), NoteLValueLocation(), clang::QualType::removeLocalConst(), and clang::SD_Static.
Referenced by handleAssignment(), handleCompoundAssignment(), handleIncDec(), and handleLValueToRValueConversion().
|
static |
Find the position where two subobject designators diverge, or equivalently the length of the common initial subsequence.
Definition at line 2535 of file ExprConstant.cpp.
References clang::Type::castAs(), clang::Type::castAsArrayTypeUnsafe(), clang::ComplexType::getElementType(), clang::ArrayType::getElementType(), I, clang::Type::isAnyComplexType(), clang::Type::isArrayType(), and clang::QualType::isNull().
Referenced by AreElementsOfSameArray().
| 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 2268 of file ExprConstant.cpp.
References clang::QualType::addConst(), AK_Read, clang::Type::castAs(), diagnoseUnreadableFields(), expandArray(), expandStringLiteral(), clang::APValue::getArrayFiller(), clang::APValue::getArrayInitializedElt(), clang::APValue::getArrayInitializedElts(), clang::Type::getAsCXXRecordDecl(), getBaseIndex(), clang::FieldDecl::getCanonicalDecl(), clang::APValue::getComplexFloatImag(), clang::APValue::getComplexFloatReal(), clang::APValue::getComplexIntImag(), clang::APValue::getComplexIntReal(), clang::ArrayType::getElementType(), getElementType(), clang::APValue::getLValueBase(), clang::APValue::getLValuePath(), clang::ConstantArrayType::getSize(), clang::APValue::getStructBase(), clang::APValue::getStructField(), clang::APValue::getUnionField(), clang::APValue::getUnionValue(), clang::APValue::hasLValuePath(), I, clang::Type::isAnyComplexType(), clang::Type::isArrayType(), clang::FieldDecl::isBitField(), clang::APValue::isComplexFloat(), clang::APValue::isComplexInt(), clang::QualType::isConstQualified(), clang::APValue::isLValue(), clang::Type::isRecordType(), clang::APValue::isUninit(), clang::TagDecl::isUnion(), clang::QualType::isVolatileQualified(), and truncateBitfieldValue().
Referenced by extractSubobject(), handleCompoundAssignment(), handleIncDec(), and modifySubobject().
Definition at line 5065 of file ExprConstant.cpp.
References GetAlignOfType(), clang::Expr::getType(), and clang::Expr::IgnoreParens().
Definition at line 5053 of file ExprConstant.cpp.
References clang::Type::getAs(), clang::Type::getPointeeType(), and clang::QualType::getTypePtr().
Referenced by GetAlignOfExpr().
|
static |
Get the base index of the given base class within an APValue representing the given derived class.
Definition at line 2103 of file ExprConstant.cpp.
References clang::CXXRecordDecl::bases_begin(), clang::CXXRecordDecl::bases_end(), E, clang::CXXRecordDecl::getCanonicalDecl(), and I.
Referenced by findSubobject().
|
static |
Sign- or zero-extend a value to 64 bits.
If it's already 64 bits, just return its existing value.
Definition at line 1244 of file ExprConstant.cpp.
|
static |
Definition at line 1488 of file ExprConstant.cpp.
Referenced by HasSameBase(), IsWeakLValue(), and isZeroSized().
|
static |
Retrieves the "underlying object type" of the given expression, as used by __builtin_object_size.
Definition at line 6298 of file ExprConstant.cpp.
References clang::Expr::getType(), and clang::ValueDecl::getType().
Referenced by clang::Sema::checkInitMethod(), clang::ObjCObjectPointerType::getInterfaceDecl(), clang::ObjCObjectPointerType::getNumProtocols(), clang::ObjCObjectPointerType::getProtocol(), clang::ObjCObjectPointerType::getTypeArgs(), clang::ObjCObjectPointerType::getTypeArgsAsWritten(), clang::ObjCObjectPointerType::isKindOfType(), clang::ObjCObjectPointerType::isObjCClassType(), clang::ObjCObjectPointerType::isObjCIdOrClassType(), clang::ObjCObjectPointerType::isObjCIdType(), clang::ObjCObjectPointerType::isObjCQualifiedClassType(), clang::ObjCObjectPointerType::isObjCQualifiedIdType(), clang::ObjCObjectPointerType::isSpecialized(), clang::ObjCObjectPointerType::isSpecializedAsWritten(), clang::ObjCObjectPointerType::isUnspecialized(), clang::ObjCObjectPointerType::qual_begin(), clang::ObjCObjectPointerType::qual_empty(), clang::ObjCObjectPointerType::qual_end(), and tryEvaluateBuiltinObjectSize().
|
static |
Perform an assignment of Val to LVal. Takes ownership of Val.
Definition at line 2832 of file ExprConstant.cpp.
References AK_Assign, findCompleteObject(), and modifySubobject().
Referenced by HandleFunctionCall().
HandleBaseToDerivedCast - Apply the given base-to-derived cast operation on the provided lvalue, which currently refers to the base object.
Definition at line 3247 of file ExprConstant.cpp.
References CastToDerivedClass(), clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::CXXRecordDecl::getCanonicalDecl(), clang::Type::getPointeeType(), clang::Expr::getType(), and clang::CastExpr::path_size().
|
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 5287 of file ExprConstant.cpp.
References End, EvaluateInPlace(), clang::RecordDecl::field_begin(), clang::RecordDecl::field_end(), clang::RecordDecl::fields(), HandleLValueDirectBase(), HandleLValueMember(), I, clang::Decl::isInvalidDecl(), and clang::TagDecl::isUnion().
|
static |
Perform a compound assignment of LVal <op>= RVal.
Definition at line 2951 of file ExprConstant.cpp.
References AK_Assign, E, findCompleteObject(), and findSubobject().
|
static |
Evaluate a constructor call.
Definition at line 3857 of file ExprConstant.cpp.
References clang::CXXRecordDecl::bases_begin(), AttributeLangSupport::C, EvaluateArgs(), EvaluateInPlace(), EvaluateStmt(), clang::RecordDecl::field_begin(), clang::RecordDecl::field_end(), clang::FunctionDecl::getBody(), clang::FieldDecl::getFieldIndex(), clang::CXXRecordDecl::getNumBases(), clang::CXXRecordDecl::getNumVBases(), clang::CXXMethodDecl::getParent(), clang::FieldDecl::getParent(), clang::APValue::getStructBase(), clang::APValue::getStructField(), clang::CXXBaseSpecifier::getType(), clang::APValue::getUnionField(), clang::APValue::getUnionValue(), HandleLValueDirectBase(), HandleLValueMember(), handleLValueToRValueConversion(), hasFields(), clang::CXXConstructorDecl::init_begin(), clang::CXXConstructorDecl::inits(), clang::FieldDecl::isBitField(), clang::CXXConstructorDecl::isCopyOrMoveConstructor(), clang::FunctionDecl::isDefaulted(), clang::CXXConstructorDecl::isDelegatingConstructor(), clang::Decl::isInvalidDecl(), clang::FunctionDecl::isTrivial(), clang::APValue::isUninit(), clang::APValue::isUnion(), clang::TagDecl::isUnion(), clang::CXXBaseSpecifier::isVirtual(), and truncateBitfieldValue().
Referenced by clang::Expr::isPotentialConstantExpr().
Definition at line 1530 of file ExprConstant.cpp.
References EvalPointerValueAsBool(), clang::APValue::getComplexFloatImag(), clang::APValue::getComplexFloatReal(), clang::APValue::getComplexIntImag(), clang::APValue::getComplexIntReal(), clang::APValue::getFloat(), clang::APValue::getInt(), clang::APValue::getKind(), clang::APValue::getMemberPointerDecl(), and Uninitialized.
Referenced by clang::Expr::EvaluateAsBooleanCondition(), and EvaluateAsBooleanCondition().
|
static |
Perform the given binary floating-point operation, in-place, on LHS.
Definition at line 1824 of file ExprConstant.cpp.
References clang::BO_Add, clang::BO_Div, clang::BO_Mul, and clang::BO_Sub.
|
static |
Definition at line 1596 of file ExprConstant.cpp.
References HandleOverflow().
|
static |
Definition at line 1581 of file ExprConstant.cpp.
References HandleOverflow(), and clang::Type::isSignedIntegerOrEnumerationType().
|
static |
Evaluate a function call.
Definition at line 3807 of file ExprConstant.cpp.
References EvaluateArgs(), EvaluateStmt(), clang::Decl::getLocEnd(), clang::FunctionDecl::getReturnType(), handleAssignment(), handleLValueToRValueConversion(), hasFields(), and clang::Type::isVoidType().
Referenced by clang::Expr::isPotentialConstantExpr().
|
static |
Perform an increment or decrement on LVal.
Definition at line 3102 of file ExprConstant.cpp.
References AK_Decrement, AK_Increment, E, findCompleteObject(), and findSubobject().
|
static |
Perform the given binary integer operation.
Definition at line 1726 of file ExprConstant.cpp.
References clang::BO_Add, clang::BO_And, clang::BO_Div, clang::BO_EQ, clang::BO_GE, clang::BO_GT, clang::BO_LE, clang::BO_LT, clang::BO_Mul, clang::BO_NE, clang::BO_Or, clang::BO_Rem, clang::BO_Shl, clang::BO_Shr, clang::BO_Sub, clang::BO_Xor, CheckedIntArithmetic(), clang::Expr::getType(), and HandleOverflow().
|
static |
Definition at line 1620 of file ExprConstant.cpp.
References HandleOverflow().
|
static |
Definition at line 1608 of file ExprConstant.cpp.
References clang::Type::isUnsignedIntegerOrEnumerationType().
|
static |
Update a pointer value to model pointer arithmetic.
| 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 1988 of file ExprConstant.cpp.
References clang::Expr::getExprLoc(), and HandleSizeof().
Referenced by tryEvaluateBuiltinObjectSize().
|
static |
Definition at line 1897 of file ExprConstant.cpp.
References CastToDerivedClass(), clang::Type::getAsCXXRecordDecl(), clang::CXXBaseSpecifier::getType(), clang::ASTRecordLayout::getVBaseClassOffset(), HandleLValueDirectBase(), clang::Decl::isInvalidDecl(), and clang::CXXBaseSpecifier::isVirtual().
Referenced by HandleLValueBasePath().
|
static |
Definition at line 1922 of file ExprConstant.cpp.
References clang::Type::getAsCXXRecordDecl(), HandleLValueBase(), clang::CastExpr::path_begin(), and clang::CastExpr::path_end().
|
static |
Update an lvalue to refer to a component of a complex number.
| 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 2006 of file ExprConstant.cpp.
References clang::Expr::getExprLoc(), and HandleSizeof().
|
static |
Definition at line 1883 of file ExprConstant.cpp.
References clang::Decl::isInvalidDecl().
Referenced by HandleClassZeroInitialization(), HandleConstructorCall(), HandleLValueBase(), and HandleMemberPointerAccess().
|
static |
Update LVal to refer to the given indirect field.
Definition at line 1952 of file ExprConstant.cpp.
References AttributeLangSupport::C, clang::IndirectFieldDecl::chain(), and HandleLValueMember().
Referenced by HandleMemberPointerAccess().
|
static |
Update LVal to refer to the given field, which must be a member of the type currently described by LVal.
Definition at line 1937 of file ExprConstant.cpp.
References clang::FieldDecl::getFieldIndex(), clang::FieldDecl::getParent(), and clang::Decl::isInvalidDecl().
Referenced by HandleClassZeroInitialization(), HandleConstructorCall(), HandleLValueIndirectMember(), and HandleMemberPointerAccess().
|
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.
| 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. |
Definition at line 2794 of file ExprConstant.cpp.
References AK_Read, Evaluate(), extractSubobject(), findCompleteObject(), clang::Expr::getType(), and clang::QualType::isVolatileQualified().
Referenced by EvaluateAsRValue(), HandleConstructorCall(), and HandleFunctionCall().
|
static |
HandleMemberPointerAccess - Evaluate a member access operation and build an lvalue referring to the result.
| 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. |
Definition at line 3145 of file ExprConstant.cpp.
References CastToDerivedClass(), EvaluateMemberPointer(), clang::Type::getAs(), clang::Type::getAsCXXRecordDecl(), clang::CXXRecordDecl::getCanonicalDecl(), clang::Type::getPointeeType(), HandleLValueDirectBase(), HandleLValueIndirectMember(), HandleLValueMember(), and I.
Referenced by HandleMemberPointerAccess().
|
static |
Definition at line 3227 of file ExprConstant.cpp.
References clang::BO_PtrMemD, clang::BO_PtrMemI, EvaluateMemberPointer(), EvaluateObjectArgument(), clang::BinaryOperator::getLHS(), clang::BinaryOperator::getOpcode(), clang::BinaryOperator::getRHS(), clang::Expr::getType(), and HandleMemberPointerAccess().
|
static |
Definition at line 1574 of file ExprConstant.cpp.
Referenced by CheckedIntArithmetic(), HandleFloatToFloatCast(), HandleFloatToIntCast(), handleIntIntBinOp(), and HandleIntToFloatCast().
|
static |
Get the size of the given type in char units.
Definition at line 1962 of file ExprConstant.cpp.
References clang::Type::isConstantSizeType(), clang::Type::isFunctionType(), and clang::Type::isVoidType().
Referenced by HandleLValueArrayAdjustment(), and HandleLValueComplexElement().
|
static |
Determine if a class has any fields that might need to be copied by a trivial copy or move operation.
Definition at line 3771 of file ExprConstant.cpp.
References clang::CXXRecordDecl::bases(), clang::RecordDecl::fields(), and clang::CXXRecordDecl::isEmpty().
Referenced by HandleConstructorCall(), and HandleFunctionCall().
|
static |
Definition at line 6826 of file ExprConstant.cpp.
References clang::Decl::getCanonicalDecl(), GetLValueBaseDecl(), and IsGlobalLValue().
|
static |
Definition at line 8868 of file ExprConstant.cpp.
References clang::Expr::EvalStatus::HasSideEffects, clang::Expr::EvalStatus::HasUndefinedBehavior, clang::Expr::SE_AllowSideEffects, and clang::Expr::SE_AllowUndefinedBehavior.
Referenced by clang::Expr::EvaluateAsInt(), and clang::Expr::isEvaluatable().
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 6316 of file ExprConstant.cpp.
References clang::CK_AddressSpaceConversion, clang::CK_BitCast, clang::CK_NoOp, clang::CastExpr::getCastKind(), clang::Expr::getType(), clang::Type::hasPointerRepresentation(), clang::Expr::IgnoreParens(), and clang::Expr::isRValue().
Referenced by tryEvaluateBuiltinObjectSize().
Definition at line 2096 of file ExprConstant.cpp.
References clang::QualType::getQualifiers(), clang::Qualifiers::hasConst(), and clang::Qualifiers::hasVolatile().
Referenced by CheckICE().
|
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".
Definition at line 6349 of file ExprConstant.cpp.
References clang::Type::castAs(), E, clang::ASTContext::getAsArrayType(), clang::ASTContext::getASTRecordLayout(), clang::ComplexType::getElementType(), clang::ArrayType::getElementType(), clang::ASTRecordLayout::getFieldCount(), clang::CXXMethodDecl::getParent(), clang::ConstantArrayType::getSize(), clang::ValueDecl::getType(), I, clang::Type::isAnyComplexType(), clang::Type::isArrayType(), and clang::TagDecl::isUnion().
Referenced by tryEvaluateBuiltinObjectSize().
|
static |
Definition at line 1256 of file ExprConstant.cpp.
References E, clang::CompoundLiteralExpr::isFileScope(), clang::Expr::isLValue(), IsStringLiteralCall(), and clang::SD_Static.
Referenced by CheckLValueConstantExpression(), HasSameBase(), and clang::Expr::EvalResult::isGlobalLValue().
|
static |
Definition at line 1492 of file ExprConstant.cpp.
References E.
|
static |
Determine whether this is a pointer past the end of the complete object referred to by the lvalue.
Definition at line 6848 of file ExprConstant.cpp.
References clang::ASTContext::getTypeSizeInChars(), and clang::Type::isIncompleteType().
|
static |
Definition at line 2846 of file ExprConstant.cpp.
References clang::ASTContext::getIntWidth(), clang::ASTContext::IntTy, and clang::Type::isSignedIntegerType().
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 2185 of file ExprConstant.cpp.
References clang::CXXRecordDecl::bases(), clang::RecordDecl::field_empty(), clang::RecordDecl::fields(), clang::Type::getAsCXXRecordDecl(), clang::Type::getBaseElementTypeUnsafe(), clang::CXXRecordDecl::isEmpty(), and clang::TagDecl::isUnion().
Referenced by diagnoseUnreadableFields().
Should this call expression be treated as a string literal?
Definition at line 1250 of file ExprConstant.cpp.
References clang::CallExpr::getBuiltinCallee().
Referenced by IsGlobalLValue().
|
static |
Definition at line 1499 of file ExprConstant.cpp.
References GetLValueBaseDecl(), and clang::ValueDecl::isWeak().
|
static |
Definition at line 1504 of file ExprConstant.cpp.
References clang::Decl::getASTContext(), GetLValueBaseDecl(), clang::ValueDecl::getType(), clang::ASTContext::getTypeSize(), clang::Type::isArrayType(), and clang::Type::isIncompleteType().
|
static |
Update the designated sub-object of an rvalue to the given value.
Definition at line 2525 of file ExprConstant.cpp.
References findSubobject().
Referenced by handleAssignment().
|
static |
Definition at line 9014 of file ExprConstant.cpp.
Referenced by CheckEvalInICE(), and CheckICE().
|
static |
Definition at line 1312 of file ExprConstant.cpp.
References clang::Expr::getExprLoc(), and clang::Decl::getLocation().
Referenced by CheckLValueConstantExpression(), and findCompleteObject().
|
static |
Tests to see if the LValue has a designator (that isn't necessarily valid).
Definition at line 6403 of file ExprConstant.cpp.
Referenced by tryEvaluateBuiltinObjectSize().
|
static |
Definition at line 1631 of file ExprConstant.cpp.
References clang::FieldDecl::getBitWidthValue(), clang::APValue::getInt(), clang::FieldDecl::isBitField(), clang::APValue::isInt(), and clang::APValue::isLValue().
Referenced by findSubobject(), and HandleConstructorCall().
|
static |
Definition at line 7939 of file ExprConstant.cpp.
References clang::ASTContext::getFloatTypeSemantics(), clang::StringLiteral::getString(), clang::ASTContext::getTargetInfo(), clang::Expr::IgnoreParenCasts(), and clang::TargetInfo::isNan2008().
|
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 6421 of file ExprConstant.cpp.
References E, End, clang::serialized_diags::Error, EvaluateAsRValue(), EvaluatePointer(), getObjectType(), HandleLValueArrayAdjustment(), ignorePointerCastsAndParens(), isDesignatorAtObjectEnd(), clang::Type::isFunctionType(), clang::Expr::isGLValue(), clang::Type::isIncompleteType(), clang::CharUnits::isNegative(), clang::QualType::isNull(), refersToCompleteObject(), and S.
Referenced by clang::Expr::tryEvaluateObjectSize().
|
static |
Definition at line 9016 of file ExprConstant.cpp.
Referenced by CheckICE().
1.8.6