d: Merge upstream dmd, druntime e48bc0987d, phobos 2458e8f82.
[official-gcc.git] / gcc / d / dmd / init.h
blob67d0527a3b2dbfcfc5eb5f2f5876b415d15f02bc
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;
83 void accept(Visitor *v) override { v->visit(this); }
86 class ExpInitializer final : public Initializer
88 public:
89 d_bool expandTuples;
90 Expression *exp;
92 void accept(Visitor *v) override { v->visit(this); }
95 struct Designator
97 Expression *exp;
98 Identifier *ident;
101 struct DesigInit
103 Designators *designatorList;
104 Initializer *initializer;
107 class CInitializer final : public Initializer
109 public:
110 DesigInits initializerList;
111 Type *type; // type that array will be used to initialize
112 d_bool sem; // true if semantic() is run
114 void accept(Visitor *v) override { v->visit(this); }
117 Expression *initializerToExpression(Initializer *init, Type *t = NULL, const bool isCfile = false);