d: Merge upstream dmd, druntime 4c18eed967, phobos d945686a4.
[official-gcc.git] / gcc / d / dmd / init.h
blob4ab5848454e0e50b96dfac62d22d19b8ef450912
2 /* Compiler implementation of the D programming language
3 * Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
4 * written by Walter Bright
5 * https://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * https://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/dlang/dmd/blob/master/src/dmd/init.h
9 */
11 #pragma once
13 #include "ast_node.h"
14 #include "globals.h"
15 #include "arraytypes.h"
16 #include "visitor.h"
18 class Identifier;
19 class Expression;
20 class Type;
21 class ErrorInitializer;
22 class VoidInitializer;
23 class StructInitializer;
24 class ArrayInitializer;
25 class ExpInitializer;
26 class CInitializer;
28 enum NeedInterpret { INITnointerpret, INITinterpret };
30 class Initializer : public ASTNode
32 public:
33 Loc loc;
34 unsigned char kind;
36 DYNCAST dyncast() const override { return DYNCAST_INITIALIZER; }
38 ErrorInitializer *isErrorInitializer();
39 VoidInitializer *isVoidInitializer();
40 StructInitializer *isStructInitializer();
41 ArrayInitializer *isArrayInitializer();
42 ExpInitializer *isExpInitializer();
43 CInitializer *isCInitializer();
45 void accept(Visitor *v) override { v->visit(this); }
48 class VoidInitializer final : public Initializer
50 public:
51 Type *type; // type that this will initialize to
53 void accept(Visitor *v) override { v->visit(this); }
56 class ErrorInitializer final : public Initializer
58 public:
59 void accept(Visitor *v) override { v->visit(this); }
62 class StructInitializer final : public Initializer
64 public:
65 Identifiers field; // of Identifier *'s
66 Initializers value; // parallel array of Initializer *'s
68 void accept(Visitor *v) override { v->visit(this); }
71 class ArrayInitializer final : public Initializer
73 public:
74 Expressions index; // indices
75 Initializers value; // of Initializer *'s
76 unsigned dim; // length of array being initialized
77 Type *type; // type that array will be used to initialize
78 d_bool sem; // true if semantic() is run
79 d_bool isCarray; // C array semantics
81 bool isAssociativeArray() const;
82 Expression *toAssocArrayLiteral();
84 void accept(Visitor *v) override { v->visit(this); }
87 class ExpInitializer final : public Initializer
89 public:
90 d_bool expandTuples;
91 Expression *exp;
93 void accept(Visitor *v) override { v->visit(this); }
96 struct Designator
98 Expression *exp;
99 Identifier *ident;
102 struct DesigInit
104 Designators *designatorList;
105 Initializer *initializer;
108 class CInitializer final : public Initializer
110 public:
111 DesigInits initializerList;
112 Type *type; // type that array will be used to initialize
113 d_bool sem; // true if semantic() is run
115 void accept(Visitor *v) override { v->visit(this); }
118 Expression *initializerToExpression(Initializer *init, Type *t = NULL, const bool isCfile = false);