40 return Func->isConstexpr();
45 bool Recursing = !Stk.
empty();
46 size_t StackSizeBefore = Stk.
size();
51 if (Res.isInvalid()) {
75 bool Recursing = !Stk.
empty();
76 size_t StackSizeBefore = Stk.
size();
79 auto Res =
C.interpretExpr(
E,
false,
81 if (Res.isInvalid()) {
104 bool Recursing = !Stk.
empty();
105 size_t StackSizeBefore = Stk.
size();
112 if (Res.isInvalid()) {
194 return classify(AT->getValueType());
196 if (
const auto *DT = dyn_cast<DecltypeType>(
T))
197 return classify(DT->getUnderlyingType());
241 assert(InitialFunction);
260 if (
Base == StaticDecl ||
Base->isDerivedFrom(StaticDecl)) {
268 "Couldn't find an overriding function in the class hierarchy?");
275 bool IsBeingCompiled =
Func &&
Func->isDefined() && !
Func->isFullyCompiled();
276 bool WasNotDefined =
Func && !
Func->isConstexpr() && !
Func->isDefined();
281 if (!
Func || WasNotDefined) {
293 const auto *FinalDecl = cast<CXXRecordDecl>(BaseDecl);
295 const Record *CurRecord = P->getOrCreateRecord(CurDecl);
296 assert(CurDecl && FinalDecl);
298 unsigned OffsetSum = 0;
302 for (
const Record::Base &B : CurRecord->
bases()) {
303 const auto *BaseDecl = cast<CXXRecordDecl>(B.Decl);
305 if (BaseDecl == FinalDecl || BaseDecl->isDerivedFrom(FinalDecl)) {
306 OffsetSum += B.Offset;
312 if (CurDecl == FinalDecl)
316 assert(OffsetSum > 0);
321 return P->getOrCreateRecord(
D);
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
unsigned getIntWidth(QualType T) const
const llvm::fltSemantics & getFloatTypeSemantics(QualType T) const
Return the APFloat 'semantics' for the specified scalar floating point type.
const LangOptions & getLangOpts() const
const TargetInfo & getTargetInfo() const
Represents a base class of a C++ class.
QualType getType() const
Retrieves the type of the base class.
Represents a static or instance method of a struct/union/class.
CXXMethodDecl * getCorrespondingMethodDeclaredInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find if RD declares a function that overrides this function, and if so, return it.
Represents a C++ struct/union/class.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
base_class_iterator bases_begin()
This represents one expression.
Represents a function declaration or definition.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
A (possibly-)qualified type.
Represents a struct/union/class.
unsigned getCharWidth() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isBlockPointerType() const
bool isBooleanType() const
bool isFunctionReferenceType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool isUnsignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is unsigned or an enumeration types whose underlying ...
bool isFunctionPointerType() const
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isAnyComplexType() const
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool isMemberPointerType() const
bool isPointerOrReferenceType() const
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isFloatingType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
Represents a variable declaration or definition.
Pointer into the code segment.
Compilation context for expressions.
const LangOptions & getLangOpts() const
Returns the language options.
~Context()
Cleans up the constexpr VM.
Context(ASTContext &Ctx)
Initialises the constexpr VM.
unsigned getCharBit() const
Returns CHAR_BIT.
bool evaluateAsInitializer(State &Parent, const VarDecl *VD, APValue &Result)
Evaluates a toplevel initializer.
const llvm::fltSemantics & getFloatSemantics(QualType T) const
Return the floating-point semantics for T.
static bool shouldBeGloballyIndexed(const ValueDecl *VD)
Returns whether we should create a global variable for the given ValueDecl.
unsigned collectBaseOffset(const RecordDecl *BaseDecl, const RecordDecl *DerivedDecl) const
const Record * getRecord(const RecordDecl *D) const
bool isPotentialConstantExpr(State &Parent, const FunctionDecl *FnDecl)
Checks if a function is a potential constant expression.
bool evaluateAsRValue(State &Parent, const Expr *E, APValue &Result)
Evaluates a toplevel expression as an rvalue.
const CXXMethodDecl * getOverridingFunction(const CXXRecordDecl *DynamicDecl, const CXXRecordDecl *StaticDecl, const CXXMethodDecl *InitialFunction) const
bool evaluate(State &Parent, const Expr *E, APValue &Result, ConstantExprKind Kind)
Like evaluateAsRvalue(), but does no implicit lvalue-to-rvalue conversion.
std::optional< PrimType > classify(QualType T) const
Classifies a type.
const Function * getOrCreateFunction(const FunctionDecl *FD)
Frame storing local variables.
void clearTo(size_t NewSize)
void clear()
Clears the stack without calling any destructors.
size_t size() const
Returns the size of the stack in bytes.
bool empty() const
Returns whether the stack is empty.
The program contains and links the bytecode for all functions.
Structure/Class descriptor.
unsigned getNumBases() const
llvm::iterator_range< const_base_iter > bases() const
Interface for the VM to interact with the AST walker's context.
Defines the clang::TargetInfo interface.
bool CheckGlobalInitialized(InterpState &S, CodePtr OpPC, const Pointer &Ptr)
Check if a global variable is initialized.
bool Interpret(InterpState &S)
Interpreter entry point.
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T