]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/d/dmd/init.h
Merge dmd upstream 6d5b853d3
[thirdparty/gcc.git] / gcc / d / dmd / init.h
CommitLineData
b4c522fa
IB
1
2/* Compiler implementation of the D programming language
f3ed896c 3 * Copyright (C) 1999-2019 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"
14
15#include "globals.h"
16#include "arraytypes.h"
17#include "visitor.h"
18
19class Identifier;
20class Expression;
21struct Scope;
22class Type;
23class AggregateDeclaration;
24class ErrorInitializer;
25class VoidInitializer;
26class StructInitializer;
27class ArrayInitializer;
28class ExpInitializer;
29
30enum NeedInterpret { INITnointerpret, INITinterpret };
31
32class Initializer : public RootObject
33{
34public:
35 Loc loc;
36
37 Initializer(Loc loc);
38 virtual Initializer *syntaxCopy() = 0;
39 static Initializers *arraySyntaxCopy(Initializers *ai);
40
41 const char *toChars();
42
43 virtual ErrorInitializer *isErrorInitializer() { return NULL; }
44 virtual VoidInitializer *isVoidInitializer() { return NULL; }
45 virtual StructInitializer *isStructInitializer() { return NULL; }
46 virtual ArrayInitializer *isArrayInitializer() { return NULL; }
47 virtual ExpInitializer *isExpInitializer() { return NULL; }
48 virtual void accept(Visitor *v) { v->visit(this); }
49};
50
51class VoidInitializer : public Initializer
52{
53public:
54 Type *type; // type that this will initialize to
55
56 VoidInitializer(Loc loc);
57 Initializer *syntaxCopy();
58
59 virtual VoidInitializer *isVoidInitializer() { return this; }
60 void accept(Visitor *v) { v->visit(this); }
61};
62
63class ErrorInitializer : public Initializer
64{
65public:
66 ErrorInitializer();
67 Initializer *syntaxCopy();
68
69 virtual ErrorInitializer *isErrorInitializer() { return this; }
70 void accept(Visitor *v) { v->visit(this); }
71};
72
73class StructInitializer : public Initializer
74{
75public:
76 Identifiers field; // of Identifier *'s
77 Initializers value; // parallel array of Initializer *'s
78
79 StructInitializer(Loc loc);
80 Initializer *syntaxCopy();
81 void addInit(Identifier *field, Initializer *value);
82
83 StructInitializer *isStructInitializer() { return this; }
84 void accept(Visitor *v) { v->visit(this); }
85};
86
87class ArrayInitializer : public Initializer
88{
89public:
90 Expressions index; // indices
91 Initializers value; // of Initializer *'s
92 unsigned dim; // length of array being initialized
93 Type *type; // type that array will be used to initialize
94 bool sem; // true if semantic() is run
95
96 ArrayInitializer(Loc loc);
97 Initializer *syntaxCopy();
98 void addInit(Expression *index, Initializer *value);
99 bool isAssociativeArray();
100 Expression *toAssocArrayLiteral();
101
102 ArrayInitializer *isArrayInitializer() { return this; }
103 void accept(Visitor *v) { v->visit(this); }
104};
105
106class ExpInitializer : public Initializer
107{
108public:
109 Expression *exp;
110 bool expandTuples;
111
112 ExpInitializer(Loc loc, Expression *exp);
113 Initializer *syntaxCopy();
114
115 ExpInitializer *isExpInitializer() { return this; }
116 void accept(Visitor *v) { v->visit(this); }
117};
118
119Expression *initializerToExpression(Initializer *init, Type *t = NULL);