]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/d/dmd/init.h
d: Merge upstream dmd 7132b3537
[thirdparty/gcc.git] / gcc / d / dmd / init.h
CommitLineData
b4c522fa
IB
1
2/* Compiler implementation of the D programming language
a3b38b77 3 * Copyright (C) 1999-2021 by The D Language Foundation, All Rights Reserved
b4c522fa
IB
4 * written by Walter Bright
5 * http://www.digitalmars.com
6 * Distributed under the Boost Software License, Version 1.0.
7 * http://www.boost.org/LICENSE_1_0.txt
8 * https://github.com/dlang/dmd/blob/master/src/dmd/init.h
9 */
10
11#pragma once
12
13#include "root/root.h"
98866120 14#include "ast_node.h"
b4c522fa
IB
15#include "globals.h"
16#include "arraytypes.h"
17#include "visitor.h"
18
19class Identifier;
20class Expression;
21struct Scope;
22class Type;
23class AggregateDeclaration;
a3b38b77 24class Initializer;
b4c522fa
IB
25class ErrorInitializer;
26class VoidInitializer;
27class StructInitializer;
28class ArrayInitializer;
29class ExpInitializer;
30
31enum NeedInterpret { INITnointerpret, INITinterpret };
32
a3b38b77
IB
33Initializer *initializerSemantic(Initializer *init, Scope *sc, Type *t, NeedInterpret needInterpret);
34
98866120 35class Initializer : public ASTNode
b4c522fa
IB
36{
37public:
38 Loc loc;
39
40 Initializer(Loc loc);
41 virtual Initializer *syntaxCopy() = 0;
42 static Initializers *arraySyntaxCopy(Initializers *ai);
43
44 const char *toChars();
45
46 virtual ErrorInitializer *isErrorInitializer() { return NULL; }
47 virtual VoidInitializer *isVoidInitializer() { return NULL; }
48 virtual StructInitializer *isStructInitializer() { return NULL; }
49 virtual ArrayInitializer *isArrayInitializer() { return NULL; }
50 virtual ExpInitializer *isExpInitializer() { return NULL; }
98866120 51 void accept(Visitor *v) { v->visit(this); }
b4c522fa
IB
52};
53
54class VoidInitializer : public Initializer
55{
56public:
57 Type *type; // type that this will initialize to
58
59 VoidInitializer(Loc loc);
60 Initializer *syntaxCopy();
61
62 virtual VoidInitializer *isVoidInitializer() { return this; }
63 void accept(Visitor *v) { v->visit(this); }
64};
65
66class ErrorInitializer : public Initializer
67{
68public:
69 ErrorInitializer();
70 Initializer *syntaxCopy();
71
72 virtual ErrorInitializer *isErrorInitializer() { return this; }
73 void accept(Visitor *v) { v->visit(this); }
74};
75
76class StructInitializer : public Initializer
77{
78public:
79 Identifiers field; // of Identifier *'s
80 Initializers value; // parallel array of Initializer *'s
81
82 StructInitializer(Loc loc);
83 Initializer *syntaxCopy();
84 void addInit(Identifier *field, Initializer *value);
85
86 StructInitializer *isStructInitializer() { return this; }
87 void accept(Visitor *v) { v->visit(this); }
88};
89
90class ArrayInitializer : public Initializer
91{
92public:
93 Expressions index; // indices
94 Initializers value; // of Initializer *'s
95 unsigned dim; // length of array being initialized
96 Type *type; // type that array will be used to initialize
97 bool sem; // true if semantic() is run
98
99 ArrayInitializer(Loc loc);
100 Initializer *syntaxCopy();
101 void addInit(Expression *index, Initializer *value);
102 bool isAssociativeArray();
103 Expression *toAssocArrayLiteral();
104
105 ArrayInitializer *isArrayInitializer() { return this; }
106 void accept(Visitor *v) { v->visit(this); }
107};
108
109class ExpInitializer : public Initializer
110{
111public:
112 Expression *exp;
113 bool expandTuples;
114
115 ExpInitializer(Loc loc, Expression *exp);
116 Initializer *syntaxCopy();
117
118 ExpInitializer *isExpInitializer() { return this; }
119 void accept(Visitor *v) { v->visit(this); }
120};
121
122Expression *initializerToExpression(Initializer *init, Type *t = NULL);