clang 23.0.0git
Compiler.h
Go to the documentation of this file.
1//===--- Compiler.h - Code generator for expressions -----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Defines the constexpr bytecode compiler.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_AST_INTERP_BYTECODEEXPRGEN_H
14#define LLVM_CLANG_AST_INTERP_BYTECODEEXPRGEN_H
15
16#include "ByteCodeEmitter.h"
17#include "EvalEmitter.h"
18#include "Pointer.h"
19#include "PrimType.h"
20#include "Record.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/Expr.h"
24
25namespace clang {
26class QualType;
27
28namespace interp {
29
30template <class Emitter> class LocalScope;
31template <class Emitter> class DestructorScope;
32template <class Emitter> class VariableScope;
33template <class Emitter> class DeclScope;
34template <class Emitter> class InitLinkScope;
35template <class Emitter> class InitStackScope;
36template <class Emitter> class OptionScope;
37template <class Emitter> class ArrayIndexScope;
38template <class Emitter> class SourceLocScope;
39template <class Emitter> class LoopScope;
40template <class Emitter> class LabelScope;
41template <class Emitter> class SwitchScope;
42template <class Emitter> class StmtExprScope;
43template <class Emitter> class LocOverrideScope;
44
45template <class Emitter> class Compiler;
46struct InitLink {
47public:
48 enum {
49 K_This = 0,
51 K_Temp = 2,
52 K_Decl = 3,
53 K_Elem = 5,
54 K_RVO = 6,
56 K_DIE = 8,
57 };
58
59 static InitLink This() { return InitLink{K_This}; }
60 static InitLink InitList() { return InitLink{K_InitList}; }
61 static InitLink RVO() { return InitLink{K_RVO}; }
62 static InitLink DIE() { return InitLink{K_DIE}; }
63 static InitLink Field(unsigned Offset) {
64 InitLink IL{K_Field};
65 IL.Offset = Offset;
66 return IL;
67 }
68 static InitLink Temp(unsigned Offset) {
69 InitLink IL{K_Temp};
70 IL.Offset = Offset;
71 return IL;
72 }
73 static InitLink Decl(const ValueDecl *D) {
74 InitLink IL{K_Decl};
75 IL.D = D;
76 return IL;
77 }
78 static InitLink Elem(unsigned Index) {
79 InitLink IL{K_Elem};
80 IL.Offset = Index;
81 return IL;
82 }
83
84 InitLink(uint8_t Kind) : Kind(Kind) {}
85 template <class Emitter>
86 bool emit(Compiler<Emitter> *Ctx, const Expr *E) const;
87
88 uint32_t Kind;
89 union {
90 unsigned Offset;
91 const ValueDecl *D;
92 };
93};
94
95/// State encapsulating if a the variable creation has been successful,
96/// unsuccessful, or no variable has been created at all.
98 std::optional<bool> S = std::nullopt;
99 VarCreationState() = default;
100 VarCreationState(bool b) : S(b) {}
102
103 operator bool() const { return S && *S; }
104 bool notCreated() const { return !S; }
105};
106
108
109/// Compilation context for expressions.
110template <class Emitter>
111class Compiler : public ConstStmtVisitor<Compiler<Emitter>, bool>,
112 public Emitter {
113protected:
114 // Aliases for types defined in the emitter.
115 using LabelTy = typename Emitter::LabelTy;
116 using AddrTy = typename Emitter::AddrTy;
118 using CaseMap = llvm::DenseMap<const SwitchCase *, LabelTy>;
119
133
134 /// Current compilation context.
136 /// Program to link to.
138
139public:
140 /// Initializes the compiler and the backend emitter.
141 template <typename... Tys>
142 Compiler(Context &Ctx, Program &P, Tys &&...Args)
143 : Emitter(Ctx, P, Args...), Ctx(Ctx), P(P) {}
144
145 // Expressions.
146 bool VisitCastExpr(const CastExpr *E);
148 bool VisitIntegerLiteral(const IntegerLiteral *E);
152 bool VisitParenExpr(const ParenExpr *E);
153 bool VisitBinaryOperator(const BinaryOperator *E);
154 bool VisitLogicalBinOp(const BinaryOperator *E);
156 bool VisitComplexBinOp(const BinaryOperator *E);
157 bool VisitVectorBinOp(const BinaryOperator *E);
161 bool VisitCallExpr(const CallExpr *E);
162 bool VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinID);
166 bool VisitGNUNullExpr(const GNUNullExpr *E);
167 bool VisitCXXThisExpr(const CXXThisExpr *E);
168 bool VisitUnaryOperator(const UnaryOperator *E);
171 bool VisitDeclRefExpr(const DeclRefExpr *E);
175 bool VisitInitListExpr(const InitListExpr *E);
177 bool VisitConstantExpr(const ConstantExpr *E);
179 bool VisitMemberExpr(const MemberExpr *E);
184 bool VisitStringLiteral(const StringLiteral *E);
186 bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E);
196 bool VisitTypeTraitExpr(const TypeTraitExpr *E);
198 bool VisitLambdaExpr(const LambdaExpr *E);
199 bool VisitPredefinedExpr(const PredefinedExpr *E);
200 bool VisitCXXThrowExpr(const CXXThrowExpr *E);
205 bool VisitSourceLocExpr(const SourceLocExpr *E);
206 bool VisitOffsetOfExpr(const OffsetOfExpr *E);
208 bool VisitSizeOfPackExpr(const SizeOfPackExpr *E);
210 bool VisitChooseExpr(const ChooseExpr *E);
211 bool VisitEmbedExpr(const EmbedExpr *E);
215 bool VisitCXXUuidofExpr(const CXXUuidofExpr *E);
216 bool VisitRequiresExpr(const RequiresExpr *E);
221 bool VisitRecoveryExpr(const RecoveryExpr *E);
222 bool VisitAddrLabelExpr(const AddrLabelExpr *E);
226 bool VisitObjCBoxedExpr(const ObjCBoxedExpr *E);
228 bool VisitStmtExpr(const StmtExpr *E);
229 bool VisitCXXNewExpr(const CXXNewExpr *E);
230 bool VisitCXXDeleteExpr(const CXXDeleteExpr *E);
231 bool VisitBlockExpr(const BlockExpr *E);
232 bool VisitCXXTypeidExpr(const CXXTypeidExpr *E);
233
234 // Statements.
235 bool visitCompoundStmt(const CompoundStmt *S);
236 bool visitDeclStmt(const DeclStmt *DS, bool EvaluateConditionDecl = false);
237 bool visitReturnStmt(const ReturnStmt *RS);
238 bool visitIfStmt(const IfStmt *IS);
239 bool visitWhileStmt(const WhileStmt *S);
240 bool visitDoStmt(const DoStmt *S);
241 bool visitForStmt(const ForStmt *S);
243 bool visitBreakStmt(const BreakStmt *S);
244 bool visitContinueStmt(const ContinueStmt *S);
245 bool visitSwitchStmt(const SwitchStmt *S);
246 bool visitCaseStmt(const CaseStmt *S);
247 bool visitDefaultStmt(const DefaultStmt *S);
248 bool visitAttributedStmt(const AttributedStmt *S);
249 bool visitCXXTryStmt(const CXXTryStmt *S);
250
251protected:
252 bool visitStmt(const Stmt *S);
253 bool visitExpr(const Expr *E, bool DestroyToplevelScope) override;
254 bool visitFunc(const FunctionDecl *F) override;
255
256 bool visitDeclAndReturn(const VarDecl *VD, const Expr *Init,
257 bool ConstantContext) override;
258
259protected:
260 /// Emits scope cleanup instructions.
261 bool emitCleanup();
262
263 /// Returns a record type from a record or pointer type.
264 const RecordType *getRecordTy(QualType Ty);
265
266 /// Returns a record from a record or pointer type.
268 Record *getRecord(const RecordDecl *RD);
269
270 /// Returns a function for the given FunctionDecl.
271 /// If the function does not exist yet, it is compiled.
272 const Function *getFunction(const FunctionDecl *FD);
273
274 OptPrimType classify(const Expr *E) const { return Ctx.classify(E); }
275 OptPrimType classify(QualType Ty) const { return Ctx.classify(Ty); }
276 bool canClassify(const Expr *E) const { return Ctx.canClassify(E); }
277 bool canClassify(QualType T) const { return Ctx.canClassify(T); }
278
279 /// Classifies a known primitive type.
281 if (auto T = classify(Ty)) {
282 return *T;
283 }
284 llvm_unreachable("not a primitive type");
285 }
286 /// Classifies a known primitive expression.
287 PrimType classifyPrim(const Expr *E) const {
288 if (auto T = classify(E))
289 return *T;
290 llvm_unreachable("not a primitive type");
291 }
292
293 /// Evaluates an expression and places the result on the stack. If the
294 /// expression is of composite type, a local variable will be created
295 /// and a pointer to said variable will be placed on the stack.
296 bool visit(const Expr *E) override;
297 /// Compiles an initializer. This is like visit() but it will never
298 /// create a variable and instead rely on a variable already having
299 /// been created. visitInitializer() then relies on a pointer to this
300 /// variable being on top of the stack.
301 bool visitInitializer(const Expr *E);
302 bool visitAsLValue(const Expr *E);
303 /// Evaluates an expression for side effects and discards the result.
304 bool discard(const Expr *E);
305 /// Just pass evaluation on to \p E. This leaves all the parsing flags
306 /// intact.
307 bool delegate(const Expr *E);
308 /// Creates and initializes a variable from the given decl.
310 bool Toplevel = false,
311 bool IsConstexprUnknown = false);
313 bool IsConstexprUnknown = false);
314 /// Visit an APValue.
315 bool visitAPValue(const APValue &Val, PrimType ValType, const Expr *E);
316 bool visitAPValueInitializer(const APValue &Val, const Expr *E, QualType T);
317 /// Visit the given decl as if we have a reference to it.
318 bool visitDeclRef(const ValueDecl *D, const Expr *E);
319
320 /// Visits an expression and converts it to a boolean.
321 bool visitBool(const Expr *E);
322
323 bool visitInitList(ArrayRef<const Expr *> Inits, const Expr *ArrayFiller,
324 const Expr *E);
325 bool visitArrayElemInit(unsigned ElemIndex, const Expr *Init,
326 OptPrimType InitT);
327 bool visitCallArgs(ArrayRef<const Expr *> Args, const FunctionDecl *FuncDecl,
328 bool Activate, bool IsOperatorCall);
329
330 /// Creates a local primitive value.
331 unsigned allocateLocalPrimitive(DeclTy &&Decl, PrimType Ty, bool IsConst,
332 bool IsVolatile = false,
334 bool IsConstexprUnknown = false);
335
336 /// Allocates a space storing a local given its type.
339 bool IsConstexprUnknown = false);
341
342private:
343 friend class VariableScope<Emitter>;
344 friend class LocalScope<Emitter>;
345 friend class DestructorScope<Emitter>;
346 friend class DeclScope<Emitter>;
347 friend class InitLinkScope<Emitter>;
348 friend class InitStackScope<Emitter>;
349 friend class OptionScope<Emitter>;
350 friend class ArrayIndexScope<Emitter>;
351 friend class SourceLocScope<Emitter>;
352 friend struct InitLink;
353 friend class LoopScope<Emitter>;
354 friend class LabelScope<Emitter>;
355 friend class SwitchScope<Emitter>;
356 friend class StmtExprScope<Emitter>;
357 friend class LocOverrideScope<Emitter>;
358
359 /// Emits a zero initializer.
360 bool visitZeroInitializer(PrimType T, QualType QT, const Expr *E);
361 bool visitZeroRecordInitializer(const Record *R, const Expr *E);
362 bool visitZeroArrayInitializer(QualType T, const Expr *E);
363 bool visitAssignment(const Expr *LHS, const Expr *RHS, const Expr *E);
364
365 /// Emits an APSInt constant.
366 bool emitConst(const llvm::APSInt &Value, PrimType Ty, const Expr *E);
367 bool emitConst(const llvm::APInt &Value, PrimType Ty, const Expr *E);
368 bool emitConst(const llvm::APSInt &Value, const Expr *E);
369 bool emitConst(const llvm::APInt &Value, const Expr *E) {
370 return emitConst(Value, classifyPrim(E), E);
371 }
372
373 /// Emits an integer constant.
374 template <typename T> bool emitConst(T Value, PrimType Ty, const Expr *E);
375 template <typename T> bool emitConst(T Value, const Expr *E);
376 bool emitBool(bool V, const Expr *E) override {
377 return this->emitConst(V, E);
378 }
379
380 llvm::RoundingMode getRoundingMode(const Expr *E) const {
382
383 if (FPO.getRoundingMode() == llvm::RoundingMode::Dynamic)
384 return llvm::RoundingMode::NearestTiesToEven;
385
386 return FPO.getRoundingMode();
387 }
388
389 uint32_t getFPOptions(const Expr *E) const {
390 return E->getFPFeaturesInEffect(Ctx.getLangOpts()).getAsOpaqueInt();
391 }
392
393 bool emitPrimCast(PrimType FromT, PrimType ToT, QualType ToQT, const Expr *E);
394 bool emitIntegralCast(PrimType FromT, PrimType ToT, QualType ToQT,
395 const Expr *E);
396 PrimType classifyComplexElementType(QualType T) const {
397 assert(T->isAnyComplexType());
398
399 QualType ElemType = T->getAs<ComplexType>()->getElementType();
400
401 return *this->classify(ElemType);
402 }
403
404 PrimType classifyVectorElementType(QualType T) const {
405 assert(T->isVectorType());
406 return *this->classify(T->getAs<VectorType>()->getElementType());
407 }
408
409 bool emitComplexReal(const Expr *SubExpr);
410 bool emitComplexBoolCast(const Expr *E);
411 bool emitComplexComparison(const Expr *LHS, const Expr *RHS,
412 const BinaryOperator *E);
413 bool emitRecordDestructionPop(const Record *R, SourceInfo Loc);
414 bool emitDestructionPop(const Descriptor *Desc, SourceInfo Loc);
415 bool emitDummyPtr(const DeclTy &D, const Expr *E);
416 bool emitFloat(const APFloat &F, const Expr *E);
417 unsigned collectBaseOffset(const QualType BaseType,
418 const QualType DerivedType);
419 bool emitLambdaStaticInvokerBody(const CXXMethodDecl *MD);
420 bool emitBuiltinBitCast(const CastExpr *E);
421 bool compileConstructor(const CXXConstructorDecl *Ctor);
422 bool compileDestructor(const CXXDestructorDecl *Dtor);
423 bool compileUnionAssignmentOperator(const CXXMethodDecl *MD);
424
425 bool checkLiteralType(const Expr *E);
426 bool maybeEmitDeferredVarInit(const VarDecl *VD);
427
428 bool refersToUnion(const Expr *E);
429
430protected:
431 /// Variable to storage mapping.
432 llvm::DenseMap<const ValueDecl *, Scope::Local> Locals;
433
434 /// OpaqueValueExpr to location mapping.
435 llvm::DenseMap<const OpaqueValueExpr *, unsigned> OpaqueExprs;
436
437 /// Current scope.
439
440 /// Current argument index. Needed to emit ArrayInitIndexExpr.
441 std::optional<uint64_t> ArrayIndex;
442
443 /// DefaultInit- or DefaultArgExpr, needed for SourceLocExpr.
444 const Expr *SourceLocDefaultExpr = nullptr;
445
446 /// Flag indicating if return value is to be discarded.
447 bool DiscardResult = false;
448
449 bool InStmtExpr = false;
450 bool ToLValue = false;
451
452 /// Flag inidicating if we're initializing an already created
453 /// variable. This is set in visitInitializer().
454 bool Initializing = false;
455 const ValueDecl *InitializingDecl = nullptr;
456
458 bool InitStackActive = false;
459
460 /// Type of the expression returned by the function.
462
463 /// Switch case mapping.
465 /// Stack of label information for loops and switch statements.
467
469};
470
471extern template class Compiler<ByteCodeEmitter>;
472extern template class Compiler<EvalEmitter>;
473
474/// Scope chain managing the variable lifetimes.
475template <class Emitter> class VariableScope {
476public:
478 : Ctx(Ctx), Parent(Ctx->VarScope), Kind(Kind) {
479 if (Parent)
480 this->LocalsAlwaysEnabled = Parent->LocalsAlwaysEnabled;
481 Ctx->VarScope = this;
482 }
483
484 virtual ~VariableScope() { Ctx->VarScope = this->Parent; }
485
486 virtual void addLocal(Scope::Local Local) {
487 llvm_unreachable("Shouldn't be called");
488 }
489 /// Like addExtended, but adds to the nearest scope of the given kind.
491 VariableScope *P = this;
492 while (P) {
493 // We found the right scope kind.
494 if (P->Kind == Kind) {
495 P->addLocal(Local);
496 return;
497 }
498 // If we reached the root scope and we're looking for a Block scope,
499 // attach it to the root instead of the current scope.
500 if (!P->Parent && Kind == ScopeKind::Block) {
501 P->addLocal(Local);
502 return;
503 }
504 P = P->Parent;
505 if (!P)
506 break;
507 }
508
509 // Add to this scope.
510 this->addLocal(Local);
511 }
512
513 virtual bool emitDestructors(const Expr *E = nullptr) { return true; }
514 virtual bool destroyLocals(const Expr *E = nullptr) { return true; }
515 virtual void forceInit() {}
516 VariableScope *getParent() const { return Parent; }
517 ScopeKind getKind() const { return Kind; }
518
519 /// Whether locals added to this scope are enabled by default.
520 /// This is almost always true, except for the two branches
521 /// of a conditional operator.
523
524protected:
525 /// Compiler instance.
527 /// Link to the parent scope.
530};
531
532/// Generic scope for local variables.
533template <class Emitter> class LocalScope : public VariableScope<Emitter> {
534public:
537
538 /// Emit a Destroy op for this scope.
539 ~LocalScope() override {
540 if (!Idx)
541 return;
542 this->Ctx->emitDestroy(*Idx, SourceInfo{});
544 }
545 /// Explicit destruction of local variables.
546 bool destroyLocals(const Expr *E = nullptr) override {
547 if (!Idx)
548 return true;
549
550 // NB: We are *not* resetting Idx here as to allow multiple
551 // calls to destroyLocals().
552 bool Success = this->emitDestructors(E);
553 this->Ctx->emitDestroy(*Idx, E);
554 return Success;
555 }
556
557 void addLocal(Scope::Local Local) override {
558 if (!Idx) {
559 Idx = static_cast<unsigned>(this->Ctx->Descriptors.size());
560 this->Ctx->Descriptors.emplace_back();
561 this->Ctx->emitInitScope(*Idx, {});
562 }
563
564 Local.EnabledByDefault = this->LocalsAlwaysEnabled;
565 this->Ctx->Descriptors[*Idx].emplace_back(Local);
566 }
567
568 /// Force-initialize this scope. Usually, scopes are lazily initialized when
569 /// the first local variable is created, but in scenarios with conditonal
570 /// operators, we need to ensure scope is initialized just in case one of the
571 /// arms will create a local and the other won't. In such a case, the
572 /// InitScope() op would be part of the arm that created the local.
573 void forceInit() override {
574 if (!Idx) {
575 Idx = static_cast<unsigned>(this->Ctx->Descriptors.size());
576 this->Ctx->Descriptors.emplace_back();
577 this->Ctx->emitInitScope(*Idx, {});
578 }
579 }
580
581 bool emitDestructors(const Expr *E = nullptr) override {
582 if (!Idx)
583 return true;
584
585 // Emit destructor calls for local variables of record
586 // type with a destructor.
587 for (Scope::Local &Local : llvm::reverse(this->Ctx->Descriptors[*Idx])) {
588 if (Local.Desc->hasTrivialDtor())
589 continue;
590
591 if (!Local.EnabledByDefault) {
592 typename Emitter::LabelTy EndLabel = this->Ctx->getLabel();
593 if (!this->Ctx->emitGetLocalEnabled(Local.Offset, E))
594 return false;
595 if (!this->Ctx->jumpFalse(EndLabel))
596 return false;
597
598 if (!this->Ctx->emitGetPtrLocal(Local.Offset, E))
599 return false;
600
601 if (!this->Ctx->emitDestructionPop(Local.Desc, Local.Desc->getLoc()))
602 return false;
603
604 this->Ctx->emitLabel(EndLabel);
605 } else {
606 if (!this->Ctx->emitGetPtrLocal(Local.Offset, E))
607 return false;
608 if (!this->Ctx->emitDestructionPop(Local.Desc, Local.Desc->getLoc()))
609 return false;
610 }
611
613 }
614 return true;
615 }
616
618 if (!Idx)
619 return;
620
621 for (const Scope::Local &Local : this->Ctx->Descriptors[*Idx]) {
623 }
624 }
625
627 if (const auto *OVE =
628 llvm::dyn_cast_if_present<OpaqueValueExpr>(Local.Desc->asExpr())) {
629 if (auto It = this->Ctx->OpaqueExprs.find(OVE);
630 It != this->Ctx->OpaqueExprs.end())
631 this->Ctx->OpaqueExprs.erase(It);
632 };
633 }
634
635 /// Index of the scope in the chain.
636 UnsignedOrNone Idx = std::nullopt;
637};
638
639template <class Emitter> class ArrayIndexScope final {
640public:
641 ArrayIndexScope(Compiler<Emitter> *Ctx, uint64_t Index) : Ctx(Ctx) {
642 OldArrayIndex = Ctx->ArrayIndex;
643 Ctx->ArrayIndex = Index;
644 }
645
646 ~ArrayIndexScope() { Ctx->ArrayIndex = OldArrayIndex; }
647
648private:
650 std::optional<uint64_t> OldArrayIndex;
651};
652
653template <class Emitter> class SourceLocScope final {
654public:
655 SourceLocScope(Compiler<Emitter> *Ctx, const Expr *DefaultExpr) : Ctx(Ctx) {
656 assert(DefaultExpr);
657 // We only switch if the current SourceLocDefaultExpr is null.
658 if (!Ctx->SourceLocDefaultExpr) {
659 Enabled = true;
660 Ctx->SourceLocDefaultExpr = DefaultExpr;
661 }
662 }
663
665 if (Enabled)
666 Ctx->SourceLocDefaultExpr = nullptr;
667 }
668
669private:
671 bool Enabled = false;
672};
673
674template <class Emitter> class InitLinkScope final {
675public:
677 Ctx->InitStack.push_back(std::move(Link));
678 }
679
680 ~InitLinkScope() { this->Ctx->InitStack.pop_back(); }
681
682public:
684};
685
686template <class Emitter> class InitStackScope final {
687public:
689 : Ctx(Ctx), OldValue(Ctx->InitStackActive), Active(Active) {
690 Ctx->InitStackActive = Active;
691 if (Active)
692 Ctx->InitStack.push_back(InitLink::DIE());
693 }
694
696 this->Ctx->InitStackActive = OldValue;
697 if (Active)
698 Ctx->InitStack.pop_back();
699 }
700
701private:
703 bool OldValue;
704 bool Active;
705};
706
707} // namespace interp
708} // namespace clang
709
710#endif
#define V(N, I)
llvm::MachO::Record Record
Definition MachO.h:31
__device__ __2f16 b
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Definition Expr.h:4356
AddrLabelExpr - The GNU address of label extension, representing &&label.
Definition Expr.h:4553
Represents the index of the current element of an array being initialized by an ArrayInitLoopExpr.
Definition Expr.h:6024
Represents a loop initializing the elements of an array.
Definition Expr.h:5971
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2724
An Embarcadero array type trait, as used in the implementation of __array_rank and __array_extent.
Definition ExprCXX.h:2997
Represents an attribute applied to a statement.
Definition Stmt.h:2195
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4041
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6671
BreakStmt - This represents a break.
Definition Stmt.h:3127
Represents a C++2a __builtin_bit_cast(T, v) expression.
Definition ExprCXX.h:5477
Represents binding an expression to a temporary.
Definition ExprCXX.h:1494
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:724
Represents a call to a C++ constructor.
Definition ExprCXX.h:1549
A default argument (C++ [dcl.fct.default]).
Definition ExprCXX.h:1271
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1378
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2627
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition ExprCXX.h:482
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Definition StmtCXX.h:135
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition ExprCXX.h:1752
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2356
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
Definition ExprCXX.h:4310
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:769
Represents a list-initialization with parenthesis.
Definition ExprCXX.h:5142
A C++ reinterpret_cast expression (C++ [expr.reinterpret.cast]).
Definition ExprCXX.h:527
A rewritten comparison expression that was originally written using operator syntax.
Definition ExprCXX.h:287
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2197
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
Definition ExprCXX.h:801
Represents the this expression in C++.
Definition ExprCXX.h:1155
A C++ throw-expression (C++ [except.throw]).
Definition ExprCXX.h:1209
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:69
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:849
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition ExprCXX.h:1069
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
CaseStmt - Represent a case statement.
Definition Stmt.h:1912
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3679
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Definition Expr.h:4851
CompoundAssignOperator - For compound assignments (e.g.
Definition Expr.h:4303
CompoundLiteralExpr - [C99 6.5.2.5].
Definition Expr.h:3608
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1732
Represents the specialization of a concept - evaluates to a prvalue of type bool.
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Definition Expr.h:1085
ContinueStmt - This represents a continue.
Definition Stmt.h:3111
ConvertVectorExpr - Clang builtin function __builtin_convertvector This AST node provides support for...
Definition Expr.h:4722
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1273
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1623
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
DoStmt - This represents a 'do/while' stmt.
Definition Stmt.h:2824
Represents a reference to emded data.
Definition Expr.h:5129
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3662
This represents one expression.
Definition Expr.h:112
FPOptions getFPFeaturesInEffect(const LangOptions &LO) const
Returns the set of floating point options that apply to this expression.
Definition Expr.cpp:3971
An expression trait intrinsic.
Definition ExprCXX.h:3070
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
Definition Expr.h:6609
RoundingMode getRoundingMode() const
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Definition Stmt.h:2880
Represents a function declaration or definition.
Definition Decl.h:2000
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
Definition Expr.h:4926
Represents a C11 generic selection.
Definition Expr.h:6181
IfStmt - This represents an if/then/else.
Definition Stmt.h:2251
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
Definition Expr.h:1734
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:6060
Describes an C or C++ initializer list.
Definition Expr.h:5302
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition ExprCXX.h:1969
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4921
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3367
ObjCBoolLiteralExpr - Objective-C Boolean Literal.
Definition ExprObjC.h:88
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:128
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:407
ObjCStringLiteral, used for Objective-C string literals i.e.
Definition ExprObjC.h:52
OffsetOfExpr - [C99 7.17] - This represents an expression of the form offsetof(record-type,...
Definition Expr.h:2530
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1181
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2185
[C99 6.4.2.2] - A predefined identifier such as func.
Definition Expr.h:2008
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition Expr.h:6803
A (possibly-)qualified type.
Definition TypeBase.h:937
Represents a struct/union/class.
Definition Decl.h:4327
Frontend produces RecoveryExprs on semantic errors that prevent creating other well-formed expression...
Definition Expr.h:7502
C++2a [expr.prim.req]: A requires-expression provides a concise way to express requirements on templa...
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3152
ShuffleVectorExpr - clang-specific builtin-in function __builtin_shufflevector.
Definition Expr.h:4646
Represents an expression that computes the length of a parameter pack.
Definition ExprCXX.h:4442
Represents a function call to one of __builtin_LINE(), __builtin_COLUMN(), __builtin_FUNCTION(),...
Definition Expr.h:5020
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4598
Stmt - This represents one statement.
Definition Stmt.h:86
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
Represents a reference to a non-type template parameter that has been substituted with a template arg...
Definition ExprCXX.h:4665
SwitchStmt - This represents a 'switch' stmt.
Definition Stmt.h:2501
A type trait used in the implementation of various C++11 and Library TR1 trait templates.
Definition ExprCXX.h:2897
UnaryExprOrTypeTraitExpr - expression with either a type or (unevaluated) expression operand.
Definition Expr.h:2628
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2247
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
Represents a variable declaration or definition.
Definition Decl.h:926
WhileStmt - This represents a 'while' stmt.
Definition Stmt.h:2689
ArrayIndexScope(Compiler< Emitter > *Ctx, uint64_t Index)
Definition Compiler.h:641
A memory block, either on the stack or in the heap.
Definition InterpBlock.h:44
Compilation context for expressions.
Definition Compiler.h:112
llvm::SmallVector< InitLink > InitStack
Definition Compiler.h:457
bool VisitArrayInitIndexExpr(const ArrayInitIndexExpr *E)
bool VisitCXXDeleteExpr(const CXXDeleteExpr *E)
bool VisitOffsetOfExpr(const OffsetOfExpr *E)
bool visitContinueStmt(const ContinueStmt *S)
bool VisitCharacterLiteral(const CharacterLiteral *E)
PrimType classifyPrim(const Expr *E) const
Classifies a known primitive expression.
Definition Compiler.h:287
bool visitArrayElemInit(unsigned ElemIndex, const Expr *Init, OptPrimType InitT)
Pointer to the array(not the element!) must be on the stack when calling this.
bool VisitCXXParenListInitExpr(const CXXParenListInitExpr *E)
bool VisitConceptSpecializationExpr(const ConceptSpecializationExpr *E)
bool VisitCompoundLiteralExpr(const CompoundLiteralExpr *E)
bool visitBool(const Expr *E)
Visits an expression and converts it to a boolean.
bool VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E)
PrimType classifyPrim(QualType Ty) const
Classifies a known primitive type.
Definition Compiler.h:280
bool VisitTypeTraitExpr(const TypeTraitExpr *E)
bool VisitLambdaExpr(const LambdaExpr *E)
bool VisitMemberExpr(const MemberExpr *E)
llvm::DenseMap< const OpaqueValueExpr *, unsigned > OpaqueExprs
OpaqueValueExpr to location mapping.
Definition Compiler.h:435
bool VisitBinaryOperator(const BinaryOperator *E)
Definition Compiler.cpp:885
bool visitAttributedStmt(const AttributedStmt *S)
bool VisitPackIndexingExpr(const PackIndexingExpr *E)
VarCreationState visitDecl(const VarDecl *VD, bool IsConstexprUnknown=false)
bool visitAPValueInitializer(const APValue &Val, const Expr *E, QualType T)
bool VisitArraySubscriptExpr(const ArraySubscriptExpr *E)
bool VisitCallExpr(const CallExpr *E)
std::optional< uint64_t > ArrayIndex
Current argument index. Needed to emit ArrayInitIndexExpr.
Definition Compiler.h:441
bool VisitPseudoObjectExpr(const PseudoObjectExpr *E)
bool VisitCXXReinterpretCastExpr(const CXXReinterpretCastExpr *E)
const Function * getFunction(const FunctionDecl *FD)
Returns a function for the given FunctionDecl.
bool VisitFixedPointBinOp(const BinaryOperator *E)
bool VisitCastExpr(const CastExpr *E)
Definition Compiler.cpp:213
bool VisitObjCEncodeExpr(const ObjCEncodeExpr *E)
bool VisitFixedPointUnaryOperator(const UnaryOperator *E)
bool VisitComplexUnaryOperator(const UnaryOperator *E)
llvm::DenseMap< const SwitchCase *, LabelTy > CaseMap
Definition Compiler.h:118
bool VisitBlockExpr(const BlockExpr *E)
friend struct InitLink
Definition Compiler.h:352
bool visitAPValue(const APValue &Val, PrimType ValType, const Expr *E)
Visit an APValue.
bool VisitCXXScalarValueInitExpr(const CXXScalarValueInitExpr *E)
bool VisitLogicalBinOp(const BinaryOperator *E)
bool visitCompoundStmt(const CompoundStmt *S)
Context & Ctx
Current compilation context.
Definition Compiler.h:135
bool visitDeclRef(const ValueDecl *D, const Expr *E)
Visit the given decl as if we have a reference to it.
bool visitBreakStmt(const BreakStmt *S)
bool visitExpr(const Expr *E, bool DestroyToplevelScope) override
bool visitForStmt(const ForStmt *S)
bool VisitDeclRefExpr(const DeclRefExpr *E)
bool VisitOpaqueValueExpr(const OpaqueValueExpr *E)
bool VisitArrayInitLoopExpr(const ArrayInitLoopExpr *E)
bool VisitStmtExpr(const StmtExpr *E)
bool VisitBuiltinBitCastExpr(const BuiltinBitCastExpr *E)
Definition Compiler.cpp:821
bool VisitFixedPointLiteral(const FixedPointLiteral *E)
Definition Compiler.cpp:867
const FunctionDecl * CompilingFunction
Definition Compiler.h:468
bool VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *E)
VariableScope< Emitter > * VarScope
Current scope.
Definition Compiler.h:438
bool visitDeclAndReturn(const VarDecl *VD, const Expr *Init, bool ConstantContext) override
Toplevel visitDeclAndReturn().
bool VisitCXXNewExpr(const CXXNewExpr *E)
const ValueDecl * InitializingDecl
Definition Compiler.h:455
bool VisitCompoundAssignOperator(const CompoundAssignOperator *E)
bool visit(const Expr *E) override
Evaluates an expression and places the result on the stack.
bool delegate(const Expr *E)
Just pass evaluation on to E.
bool discard(const Expr *E)
Evaluates an expression for side effects and discards the result.
bool VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
CaseMap CaseLabels
Switch case mapping.
Definition Compiler.h:464
unsigned allocateLocalPrimitive(DeclTy &&Decl, PrimType Ty, bool IsConst, bool IsVolatile=false, ScopeKind SC=ScopeKind::Block, bool IsConstexprUnknown=false)
Creates a local primitive value.
Record * getRecord(QualType Ty)
Returns a record from a record or pointer type.
const RecordType * getRecordTy(QualType Ty)
Returns a record type from a record or pointer type.
bool VisitCXXStdInitializerListExpr(const CXXStdInitializerListExpr *E)
bool visitInitList(ArrayRef< const Expr * > Inits, const Expr *ArrayFiller, const Expr *E)
bool VisitSizeOfPackExpr(const SizeOfPackExpr *E)
bool VisitPredefinedExpr(const PredefinedExpr *E)
bool VisitSourceLocExpr(const SourceLocExpr *E)
Compiler(Context &Ctx, Program &P, Tys &&...Args)
Initializes the compiler and the backend emitter.
Definition Compiler.h:142
bool visitDeclStmt(const DeclStmt *DS, bool EvaluateConditionDecl=false)
bool emitCleanup()
Emits scope cleanup instructions.
bool VisitExtVectorElementExpr(const ExtVectorElementExpr *E)
bool VisitObjCStringLiteral(const ObjCStringLiteral *E)
bool VisitArrayTypeTraitExpr(const ArrayTypeTraitExpr *E)
bool visitInitializer(const Expr *E)
Compiles an initializer.
const Expr * SourceLocDefaultExpr
DefaultInit- or DefaultArgExpr, needed for SourceLocExpr.
Definition Compiler.h:444
UnsignedOrNone OptLabelTy
Definition Compiler.h:117
bool VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *E)
bool VisitPointerArithBinOp(const BinaryOperator *E)
Perform addition/subtraction of a pointer and an integer or subtraction of two pointers.
bool visitCallArgs(ArrayRef< const Expr * > Args, const FunctionDecl *FuncDecl, bool Activate, bool IsOperatorCall)
bool VisitObjCBoolLiteralExpr(const ObjCBoolLiteralExpr *E)
bool visitDefaultStmt(const DefaultStmt *S)
typename Emitter::LabelTy LabelTy
Definition Compiler.h:115
bool VisitCXXDynamicCastExpr(const CXXDynamicCastExpr *E)
bool visitStmt(const Stmt *S)
bool VisitExpressionTraitExpr(const ExpressionTraitExpr *E)
bool VisitVectorUnaryOperator(const UnaryOperator *E)
bool VisitCXXConstructExpr(const CXXConstructExpr *E)
bool VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *E)
bool VisitObjCBoxedExpr(const ObjCBoxedExpr *E)
VarCreationState visitVarDecl(const VarDecl *VD, const Expr *Init, bool Toplevel=false, bool IsConstexprUnknown=false)
Creates and initializes a variable from the given decl.
bool VisitCXXInheritedCtorInitExpr(const CXXInheritedCtorInitExpr *E)
bool VisitRecoveryExpr(const RecoveryExpr *E)
bool VisitRequiresExpr(const RequiresExpr *E)
bool Initializing
Flag inidicating if we're initializing an already created variable.
Definition Compiler.h:454
bool visitReturnStmt(const ReturnStmt *RS)
bool VisitCXXThrowExpr(const CXXThrowExpr *E)
bool VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
bool VisitChooseExpr(const ChooseExpr *E)
bool visitFunc(const FunctionDecl *F) override
bool visitCXXForRangeStmt(const CXXForRangeStmt *S)
bool visitCaseStmt(const CaseStmt *S)
bool VisitComplexBinOp(const BinaryOperator *E)
llvm::DenseMap< const ValueDecl *, Scope::Local > Locals
Variable to storage mapping.
Definition Compiler.h:432
bool VisitAbstractConditionalOperator(const AbstractConditionalOperator *E)
bool VisitCXXTypeidExpr(const CXXTypeidExpr *E)
UnsignedOrNone allocateTemporary(const Expr *E)
bool VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinID)
bool VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E)
typename Emitter::AddrTy AddrTy
Definition Compiler.h:116
bool VisitCXXRewrittenBinaryOperator(const CXXRewrittenBinaryOperator *E)
OptPrimType classify(QualType Ty) const
Definition Compiler.h:275
OptPrimType ReturnType
Type of the expression returned by the function.
Definition Compiler.h:461
bool VisitUnaryOperator(const UnaryOperator *E)
bool VisitFloatCompoundAssignOperator(const CompoundAssignOperator *E)
OptPrimType classify(const Expr *E) const
Definition Compiler.h:274
llvm::SmallVector< LabelInfo > LabelInfoStack
Stack of label information for loops and switch statements.
Definition Compiler.h:466
bool VisitGenericSelectionExpr(const GenericSelectionExpr *E)
bool visitDoStmt(const DoStmt *S)
bool VisitIntegerLiteral(const IntegerLiteral *E)
Definition Compiler.cpp:826
bool VisitInitListExpr(const InitListExpr *E)
bool VisitVectorBinOp(const BinaryOperator *E)
bool VisitStringLiteral(const StringLiteral *E)
bool VisitParenExpr(const ParenExpr *E)
Definition Compiler.cpp:880
bool VisitCXXNoexceptExpr(const CXXNoexceptExpr *E)
bool VisitShuffleVectorExpr(const ShuffleVectorExpr *E)
bool VisitPointerCompoundAssignOperator(const CompoundAssignOperator *E)
bool DiscardResult
Flag indicating if return value is to be discarded.
Definition Compiler.h:447
bool VisitEmbedExpr(const EmbedExpr *E)
bool VisitConvertVectorExpr(const ConvertVectorExpr *E)
bool VisitCXXThisExpr(const CXXThisExpr *E)
bool VisitConstantExpr(const ConstantExpr *E)
bool VisitUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *E)
bool visitSwitchStmt(const SwitchStmt *S)
bool canClassify(QualType T) const
Definition Compiler.h:277
bool VisitCXXUuidofExpr(const CXXUuidofExpr *E)
bool VisitExprWithCleanups(const ExprWithCleanups *E)
bool visitAsLValue(const Expr *E)
bool visitWhileStmt(const WhileStmt *S)
bool visitIfStmt(const IfStmt *IS)
bool VisitAddrLabelExpr(const AddrLabelExpr *E)
bool canClassify(const Expr *E) const
Definition Compiler.h:276
bool VisitFloatingLiteral(const FloatingLiteral *E)
Definition Compiler.cpp:834
Program & P
Program to link to.
Definition Compiler.h:137
bool VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E)
bool VisitGNUNullExpr(const GNUNullExpr *E)
UnsignedOrNone allocateLocal(DeclTy &&Decl, QualType Ty=QualType(), ScopeKind=ScopeKind::Block, bool IsConstexprUnknown=false)
Allocates a space storing a local given its type.
bool VisitImaginaryLiteral(const ImaginaryLiteral *E)
Definition Compiler.cpp:843
bool VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E)
bool visitCXXTryStmt(const CXXTryStmt *S)
Holds all information required to evaluate constexpr code in a module.
Definition Context.h:42
const LangOptions & getLangOpts() const
Returns the language options.
Definition Context.cpp:370
Scope used to handle temporaries in toplevel variable declarations.
Definition Compiler.cpp:40
Bytecode function.
Definition Function.h:99
InitLinkScope(Compiler< Emitter > *Ctx, InitLink &&Link)
Definition Compiler.h:676
Compiler< Emitter > * Ctx
Definition Compiler.h:683
InitStackScope(Compiler< Emitter > *Ctx, bool Active)
Definition Compiler.h:688
When generating code for e.g.
Definition Compiler.cpp:188
Generic scope for local variables.
Definition Compiler.h:533
UnsignedOrNone Idx
Index of the scope in the chain.
Definition Compiler.h:636
~LocalScope() override
Emit a Destroy op for this scope.
Definition Compiler.h:539
bool destroyLocals(const Expr *E=nullptr) override
Explicit destruction of local variables.
Definition Compiler.h:546
bool emitDestructors(const Expr *E=nullptr) override
Definition Compiler.h:581
void removeIfStoredOpaqueValue(const Scope::Local &Local)
Definition Compiler.h:626
void addLocal(Scope::Local Local) override
Definition Compiler.h:557
void forceInit() override
Force-initialize this scope.
Definition Compiler.h:573
LocalScope(Compiler< Emitter > *Ctx, ScopeKind Kind=ScopeKind::Block)
Definition Compiler.h:535
Sets the context for break/continue statements.
Definition Compiler.cpp:114
Scope used to handle initialization methods.
Definition Compiler.cpp:60
The program contains and links the bytecode for all functions.
Definition Program.h:36
Structure/Class descriptor.
Definition Record.h:25
Describes the statement/declaration an opcode was generated from.
Definition Source.h:74
SourceLocScope(Compiler< Emitter > *Ctx, const Expr *DefaultExpr)
Definition Compiler.h:655
Scope chain managing the variable lifetimes.
Definition Compiler.h:475
void addForScopeKind(const Scope::Local &Local, ScopeKind Kind)
Like addExtended, but adds to the nearest scope of the given kind.
Definition Compiler.h:490
bool LocalsAlwaysEnabled
Whether locals added to this scope are enabled by default.
Definition Compiler.h:522
Compiler< Emitter > * Ctx
Compiler instance.
Definition Compiler.h:526
virtual bool emitDestructors(const Expr *E=nullptr)
Definition Compiler.h:513
VariableScope(Compiler< Emitter > *Ctx, ScopeKind Kind=ScopeKind::Block)
Definition Compiler.h:477
virtual bool destroyLocals(const Expr *E=nullptr)
Definition Compiler.h:514
virtual void addLocal(Scope::Local Local)
Definition Compiler.h:486
VariableScope * Parent
Link to the parent scope.
Definition Compiler.h:528
ScopeKind getKind() const
Definition Compiler.h:517
VariableScope * getParent() const
Definition Compiler.h:516
#define bool
Definition gpuintrin.h:32
bool Call(InterpState &S, CodePtr OpPC, const Function *Func, uint32_t VarArgSize)
Definition Interp.cpp:1677
llvm::PointerUnion< const Decl *, const Expr * > DeclTy
Definition Descriptor.h:29
static bool Activate(InterpState &S, CodePtr OpPC)
Definition Interp.h:2023
llvm::APFloat APFloat
Definition Floating.h:27
PrimType
Enumeration of the primitive types of the VM.
Definition PrimType.h:34
bool Init(InterpState &S, CodePtr OpPC)
Definition Interp.h:2140
The JSON file list parser is used to communicate input to InstallAPI.
@ Success
Annotation was successful.
Definition Parser.h:65
@ Link
'link' clause, allowed on 'declare' construct.
const VariableScope< Emitter > * BreakOrContinueScope
Definition Compiler.h:122
LabelInfo(const Stmt *Name, OptLabelTy BreakLabel, OptLabelTy ContinueLabel, OptLabelTy DefaultLabel, const VariableScope< Emitter > *BreakOrContinueScope)
Definition Compiler.h:126
Information about a local's storage.
Definition Function.h:39
State encapsulating if a the variable creation has been successful, unsuccessful, or no variable has ...
Definition Compiler.h:97
static VarCreationState NotCreated()
Definition Compiler.h:101
std::optional< bool > S
Definition Compiler.h:98