annotate gcc/d/dmd/init.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 /* Compiler implementation of the D programming language
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * written by Walter Bright
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * http://www.digitalmars.com
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * http://www.boost.org/LICENSE_1_0.txt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 * https://github.com/D-Programming-Language/dmd/blob/master/src/init.c
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 #include "root/dsystem.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #include "root/checkedint.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "mars.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "init.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 #include "expression.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 #include "statement.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 #include "identifier.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #include "declaration.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #include "aggregate.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #include "scope.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 #include "mtype.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #include "hdrgen.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 #include "template.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 #include "id.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 #include "tokens.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 Expression *semantic(Expression *e, Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 Initializer *semantic(Initializer *init, Scope *sc, Type *t, NeedInterpret needInterpret);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 /********************************** Initializer *******************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 Initializer::Initializer(Loc loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 this->loc = loc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 Initializers *Initializer::arraySyntaxCopy(Initializers *ai)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 Initializers *a = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 if (ai)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 a = new Initializers();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 a->setDim(ai->dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 for (size_t i = 0; i < a->dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 (*a)[i] = (*ai)[i]->syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 return a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 const char *Initializer::toChars()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 OutBuffer buf;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 HdrGenState hgs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 ::toCBuffer(this, &buf, &hgs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 return buf.extractString();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 /********************************** ErrorInitializer ***************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 ErrorInitializer::ErrorInitializer()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 : Initializer(Loc())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 Initializer *ErrorInitializer::syntaxCopy()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 return this;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 /********************************** VoidInitializer ***************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 VoidInitializer::VoidInitializer(Loc loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 : Initializer(loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 type = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 Initializer *VoidInitializer::syntaxCopy()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 return new VoidInitializer(loc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 /********************************** StructInitializer *************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 StructInitializer::StructInitializer(Loc loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 : Initializer(loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 Initializer *StructInitializer::syntaxCopy()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 StructInitializer *ai = new StructInitializer(loc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 assert(field.dim == value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 ai->field.setDim(field.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 ai->value.setDim(value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 for (size_t i = 0; i < field.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 ai->field[i] = field[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 ai->value[i] = value[i]->syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 return ai;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 void StructInitializer::addInit(Identifier *field, Initializer *value)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 //printf("StructInitializer::addInit(field = %p, value = %p)\n", field, value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 this->field.push(field);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 this->value.push(value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 /********************************** ArrayInitializer ************************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 ArrayInitializer::ArrayInitializer(Loc loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 : Initializer(loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 dim = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 type = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 sem = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 Initializer *ArrayInitializer::syntaxCopy()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 //printf("ArrayInitializer::syntaxCopy()\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 ArrayInitializer *ai = new ArrayInitializer(loc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 assert(index.dim == value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 ai->index.setDim(index.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 ai->value.setDim(value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 for (size_t i = 0; i < ai->value.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 ai->index[i] = index[i] ? index[i]->syntaxCopy() : NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 ai->value[i] = value[i]->syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 return ai;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 void ArrayInitializer::addInit(Expression *index, Initializer *value)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 this->index.push(index);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 this->value.push(value);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 dim = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 type = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 bool ArrayInitializer::isAssociativeArray()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 for (size_t i = 0; i < value.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 if (index[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 /********************************
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 * If possible, convert array initializer to associative array initializer.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 Expression *ArrayInitializer::toAssocArrayLiteral()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 Expression *e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 //printf("ArrayInitializer::toAssocArrayInitializer()\n");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 //static int i; if (++i == 2) halt();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 Expressions *keys = new Expressions();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 keys->setDim(value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 Expressions *values = new Expressions();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 values->setDim(value.dim);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 for (size_t i = 0; i < value.dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 e = index[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 if (!e)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 goto Lno;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 (*keys)[i] = e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 Initializer *iz = value[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 if (!iz)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 goto Lno;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 e = initializerToExpression(iz);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 if (!e)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 goto Lno;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 (*values)[i] = e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 e = new AssocArrayLiteralExp(loc, keys, values);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 return e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 Lno:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 delete keys;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 delete values;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 error(loc, "not an associative array initializer");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 return new ErrorExp();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 /********************************** ExpInitializer ************************************/
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 ExpInitializer::ExpInitializer(Loc loc, Expression *exp)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 : Initializer(loc)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 this->exp = exp;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 this->expandTuples = false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 Initializer *ExpInitializer::syntaxCopy()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 return new ExpInitializer(loc, exp->syntaxCopy());
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 #if 1 // should be removed and rely on ctfeInterpreter()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 bool arrayHasNonConstPointers(Expressions *elems);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 bool hasNonConstPointers(Expression *e)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 if (e->type->ty == Terror)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 if (e->op == TOKnull)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 if (e->op == TOKstructliteral)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 StructLiteralExp *se = (StructLiteralExp *)e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 return arrayHasNonConstPointers(se->elements);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 if (e->op == TOKarrayliteral)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 if (!e->type->nextOf()->hasPointers())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 ArrayLiteralExp *ae = (ArrayLiteralExp *)e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 return arrayHasNonConstPointers(ae->elements);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 if (e->op == TOKassocarrayliteral)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 AssocArrayLiteralExp *ae = (AssocArrayLiteralExp *)e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 if (ae->type->nextOf()->hasPointers() &&
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 arrayHasNonConstPointers(ae->values))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 if (((TypeAArray *)ae->type)->index->hasPointers())
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 return arrayHasNonConstPointers(ae->keys);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 if(e->op == TOKaddress)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 AddrExp *ae = (AddrExp *)e;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 if (ae->e1->op == TOKstructliteral)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 StructLiteralExp *se = (StructLiteralExp *)ae->e1;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 if (!(se->stageflags & stageSearchPointers))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 int old = se->stageflags;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 se->stageflags |= stageSearchPointers;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 bool ret = arrayHasNonConstPointers(se->elements);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 se->stageflags = old;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 return ret;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 if (e->type->ty== Tpointer && e->type->nextOf()->ty != Tfunction)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 if (e->op == TOKsymoff) // address of a global is OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 if (e->op == TOKint64) // cast(void *)int is OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 if (e->op == TOKstring) // "abc".ptr is OK
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 bool arrayHasNonConstPointers(Expressions *elems)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 for (size_t i = 0; i < elems->dim; i++)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 Expression *e = (*elems)[i];
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 if (e && hasNonConstPointers(e))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 return false;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 #endif