annotate dmd/Expression.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents 7171e6ea651d
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 109
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.TOK;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
6 import dmd.Parameter;
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
7 import dmd.IdentifierExp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Scope;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
11 import dmd.Array;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.IntRange;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.InterState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.InlineCostState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.InlineDoState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.InlineScanState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.IRState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.TypeExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.DYNCAST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.CallExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.VarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.CommaExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.NullExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.AddrExp;
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
36 import dmd.LINK;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
37 import dmd.FuncExp;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
38 import dmd.ReturnStatement;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
39 import dmd.Statement;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
40 import dmd.FuncLiteralDeclaration;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
41 import dmd.TypeFunction;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.ErrorExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.CastExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.Global;
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
46 import dmd.GlobalExpressions;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.Token;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.TypeClass;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.PtrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.TypeReference;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.Complex;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.backend.elem;
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
56 import dmd.backend.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 import dmd.backend.dt_t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
59 import core.memory;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
60
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 import std.stdio : writef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 import std.conv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 /* Things like:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 * int.size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 * foo.size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 * (foo).size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 * cast(foo).size
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 Expression typeDotIdExp(Loc loc, Type type, Identifier ident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 return new DotIdExp(loc, new TypeExp(loc, type), ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 /*****************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 * Determine if 'this' is available.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 * If it is, return the FuncDeclaration that has it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 FuncDeclaration hasThis(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 FuncDeclaration fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 FuncDeclaration fdthis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 //printf("hasThis()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 fdthis = sc.parent.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 //printf("fdthis = %p, '%s'\n", fdthis, fdthis ? fdthis.toChars() : "");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 // Go upwards until we find the enclosing member function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 fd = fdthis;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 if (!fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 if (!fd.isNested())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 Dsymbol parent = fd.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 while (parent)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 TemplateInstance ti = parent.isTemplateInstance();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 if (ti)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 parent = ti.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 fd = fd.parent.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 if (!fd.isThis())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 //printf("test '%s'\n", fd.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118 goto Lno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 assert(fd.vthis);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122 return fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124 Lno:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 return null; // don't have 'this' available
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 /***************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 * Pull out any properties.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 Expression resolveProperties(Scope sc, Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 //printf("resolveProperties(%s)\n", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 if (e.type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 Type t = e.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 if (t.ty == TY.Tfunction || e.op == TOK.TOKoverloadset)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 {
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
140 static if(false)
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
141 {
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
142 if (t.ty == Tfunction && !(cast(TypeFunction)t).isproperty)
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
143 error(e.loc, "not a property %s\n", e.toChars());
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
144 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 e = new CallExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 /* Look for e being a lazy parameter; rewrite as delegate call
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 else if (e.op == TOK.TOKvar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 { VarExp ve = cast(VarExp)e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 if (ve.var.storage_class & STC.STClazy)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 e = new CallExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 else if (e.op == TOK.TOKdotexp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 e.error("expression has no value");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 else if (e.op == TOK.TOKdottd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 e = new CallExp(e.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
175 void indent(int indent)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
176 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
177 foreach (i; 0 .. indent)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
178 writef(" ");
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
179 }
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
180
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
181 string type_print(Type type)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
182 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
183 return type ? type.toChars() : "null";
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
184 }
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
185
178
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
186 import dmd.TObject;
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
187
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
188 class Expression : TObject
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 Loc loc; // file location
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 TOK op; // handy to minimize use of dynamic_cast
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 Type type; // !=null means that semantic() has been run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 int size; // # of bytes in Expression so we can copy() it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 this(Loc loc, TOK op, int size)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
197 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 //writef("Expression.Expression(op = %d %s) this = %p\n", op, to!(string)(op), this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 this.op = op;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 this.size = size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 type = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204
45
ccbc1e0bb3f0 StringExp.equals implemented
korDen
parents: 23
diff changeset
205 bool equals(Object o)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 return this is o;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 /*********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 * Does *not* do a deep copy.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 */
178
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
213 Expression copy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 141
diff changeset
215 return cloneThis(this);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 Expression syntaxCopy()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 //printf("Expression::syntaxCopy()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 //dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 return copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225 Expression semantic(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 version (LOGSEMANTIC) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 printf("Expression.semantic() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 if (type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 type = type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 type = Type.tvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 Expression trySemantic(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 uint errors = global.errors;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 global.gag++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 Expression e = semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 global.gag--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 if (errors != global.errors)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 global.errors = errors;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 DYNCAST dyncast() { return DYNCAST.DYNCAST_EXPRESSION; } // kludge for template.isExpression()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 void print()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 string toChars()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 HdrGenState hgs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 toCBuffer(buf, &hgs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 return buf.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
267 void dump(int i)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 {
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
269 indent(i);
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
270 writef("%p %s type=%s\n", this, Token.toChars(op), type_print(type));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 void error(T...)(string format, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 .error(loc, format, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 void warning(T...)(string formar, T t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 .warning(loc, format, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 void rvalue()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 if (type && type.toBasetype().ty == TY.Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 error("expression %s is void and has no value", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 static Expression combine(Expression e1, Expression e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 if (e1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 if (e2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 e1 = new CommaExp(e1.loc, e1, e2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 e1.type = e2.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 e1 = e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 return e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 static Expressions arraySyntaxCopy(Expressions exps)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316 Expressions a = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 if (exps)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 a = new Expressions();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 a.setDim(exps.dim);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
322 for (size_t i = 0; i < a.dim; i++)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
324 auto e = exps[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 e = e.syntaxCopy();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
327 a[i] = e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 return a;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 ulong toInteger()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
335 //printf("Expression %s\n", Token.toChars(op));
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
336 error("Integer constant expression expected instead of %s", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
337 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 ulong toUInteger()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 //printf("Expression %s\n", Token.toChars(op));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 return cast(ulong)toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 real toReal()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
348 error("Floating point constant expression expected instead of %s", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
349 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 real toImaginary()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
354 error("Floating point constant expression expected instead of %s", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
355 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 Complex!(real) toComplex()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
360 error("Floating point constant expression expected instead of %s", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
361 return Complex!real(0);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 void toCBuffer(OutBuffer buf, HdrGenState* hgs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 buf.writestring(Token.toChars(op));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 void toMangleBuffer(OutBuffer buf)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 {
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
371 error("expression %s is not a valid template value argument", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 assert(false);
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
373 version (DEBUG) {
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
374 dump(0);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
375 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377
66
efb1e5bdf63c more implementations
korDen
parents: 55
diff changeset
378 /***************************************
efb1e5bdf63c more implementations
korDen
parents: 55
diff changeset
379 * Return !=0 if expression is an lvalue.
efb1e5bdf63c more implementations
korDen
parents: 55
diff changeset
380 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 int isLvalue()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 {
66
efb1e5bdf63c more implementations
korDen
parents: 55
diff changeset
383 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 }
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
385
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
386 /*******************************
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
387 * Give error if we're not an lvalue.
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
388 * If we can, convert expression to be an lvalue.
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
389 */
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
390 Expression toLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
392 if (!e)
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
393 e = this;
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
394 else if (!loc.filename)
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
395 loc = e.loc;
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
396 error("%s is not an lvalue", e.toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
397 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 }
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
399
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 Expression modifiableLvalue(Scope sc, Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 //printf("Expression::modifiableLvalue() %s, type = %s\n", toChars(), type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 // See if this expression is a modifiable lvalue (i.e. not const)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 if (type && (!type.isMutable() || !type.isAssignable()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 error("%s is not mutable", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 return toLvalue(sc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413 * Do an implicit cast.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 * Issue error if it can't be done.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 Expression implicitCastTo(Scope sc, Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 //printf("Expression.implicitCastTo(%s of type %s) => %s\n", toChars(), type.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 MATCH match = implicitConvTo(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 if (match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 TY tyfrom = type.toBasetype().ty;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 TY tyto = t.toBasetype().ty;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 version (DMDV1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 if (global.params.warnings &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
428 Type.impcnvWarn[tyfrom][tyto] &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
429 op != TOKint64)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
430 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
431 Expression e = optimize(WANT.WANTflags | WANT.WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433 if (e.op == TOK.TOKint64)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
434 return e.implicitCastTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 if (tyfrom == Tint32 && (op == TOKadd || op == TOKmin || op == TOKand || op == TOKor || op == TOKxor))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 /* This is really only a semi-kludge fix,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 * we really should look at the operands of op
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 * and see if they are narrower types.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 * For example, b=b|b and b=b|7 and s=b+b should be allowed,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 * but b=b|i should be an error.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 warning("implicit conversion of expression (%s) of type %s to %s can cause loss of data", toChars(), type.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 if (match == MATCH.MATCHconst && t == type.constOf())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 Expression e = copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 e.type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 return castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 Expression e = optimize(WANT.WANTflags | WANT.WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 if (e != this)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 return e.implicitCastTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 printf("ty = %d\n", type.ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 type.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 printf("to:\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 t.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 printf("%p %p type: %s to: %s\n", type.deco, t.deco, type.deco, t.deco);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 //printf("%p %p %p\n", type.nextOf().arrayOf(), type, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 fflush(stdout);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 if (!t.deco) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 /* Can happen with:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 * enum E { One }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 * class A
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 * { static void fork(EDG dg) { dg(E.One); }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 * alias void delegate(E) EDG;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 * }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 * Should eventually make it work.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 error("forward reference to type %s", t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 } else if (t.reliesOnTident()) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 error("forward reference to type %s", t.reliesOnTident().toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 error("cannot implicitly convert expression (%s) of type %s to %s", toChars(), type.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 return castTo(sc, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 * Return !=0 if we can implicitly convert this to type t.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 * Don't do the actual cast.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 MATCH implicitConvTo(Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 printf("Expression.implicitConvTo(this=%s, type=%s, t=%s)\n",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 toChars(), type.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 //static int nest; if (++nest == 10) halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 error("%s is not an expression", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 Expression e = optimize(WANT.WANTvalue | WANT.WANTflags);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 if (e.type == t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 return MATCH.MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 if (e != this)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 //printf("\toptimized to %s of type %s\n", e.toChars(), e.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 return e.implicitConvTo(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 MATCH match = type.implicitConvTo(t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 if (match != MATCH.MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520 return match;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 /* See if we can do integral narrowing conversions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 if (type.isintegral() && t.isintegral() &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 type.isTypeBasic() && t.isTypeBasic())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 IntRange ir = getIntRange();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 if (ir.imax <= t.sizemask())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 return MATCH.MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 Type tb = t.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 if (tb.ty == Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 TypeDelegate td = cast(TypeDelegate)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 TypeFunction tf = cast(TypeFunction)td.nextOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 if (!tf.varargs && !(tf.arguments && tf.arguments.dim))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 match = type.implicitConvTo(tf.nextOf());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 if (match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 return match;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 if (tf.nextOf().toBasetype().ty == Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 return MATCH.MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 return MATCH.MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 IntRange getIntRange()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 {
53
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 45
diff changeset
554 IntRange ir;
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 45
diff changeset
555 ir.imin = 0;
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
556 if (type.isintegral())
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
557 ir.imax = type.sizemask();
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
558 else
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
559 ir.imax = 0xFFFFFFFFFFFFFFFFUL; // assume the worst
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
560
53
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 45
diff changeset
561 return ir;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 * Do an explicit cast.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 Expression castTo(Scope sc, Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 //printf("Expression.castTo(this=%s, t=%s)\n", toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 writef("Expression.castTo(this=%s, type=%s, t=%s)\n",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 toChars(), type.toChars(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 if (type is t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 Expression e = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 Type tb = t.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 Type typeb = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 if (tb != typeb)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 // Do (type *) cast of (type [dim])
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 if (tb.ty == TY.Tpointer && typeb.ty == TY.Tsarray
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 )
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 //printf("Converting [dim] to *\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 if (typeb.size(loc) == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 e = new NullExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 e = new AddrExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 if (tb.ty == Tdelegate && type.ty != Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 TypeDelegate td = cast(TypeDelegate)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 TypeFunction tf = cast(TypeFunction)td.nextOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 return toDelegate(sc, tf.nextOf());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 if (typeb.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 TypeStruct ts = cast(TypeStruct)typeb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 if (!(tb.ty == TY.Tstruct && ts.sym == (cast(TypeStruct)tb).sym) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 ts.sym.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 { /* Forward the cast to our alias this member, rewrite to:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 * cast(to)e1.aliasthis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 Expression e1 = new DotIdExp(loc, this, ts.sym.aliasthis.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 Expression e2 = new CastExp(loc, e1, tb);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 e2 = e2.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 return e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 else if (typeb.ty == TY.Tclass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 TypeClass ts = cast(TypeClass)typeb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 if (tb.ty != TY.Tclass && ts.sym.aliasthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 { /* Forward the cast to our alias this member, rewrite to:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 * cast(to)e1.aliasthis
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 Expression e1 = new DotIdExp(loc, this, ts.sym.aliasthis.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 Expression e2 = new CastExp(loc, e1, tb);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
624 e2 = e2.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
625 return e2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
626 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
627 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
628 e = new CastExp(loc, e, tb);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
629 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
630 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
631 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
632 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
633 e = e.copy(); // because of COW for assignment to e.type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
634 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
635
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
636 assert(e != this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
637 e.type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
638 //printf("Returning: %s\n", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
639 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
640 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
641
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
642 /************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
643 * Detect cases where pointers to the stack can 'escape' the
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
644 * lifetime of the stack frame.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
645 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
646 void checkEscape()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
647 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
648 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
649
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
650 void checkEscapeRef()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
651 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
652 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
653
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 void checkScalar()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 if (!type.isscalar())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 error("'%s' is not a scalar, it is a %s", toChars(), type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 rvalue();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 void checkNoBool()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 if (type.toBasetype().ty == TY.Tbool)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
665 error("operation not allowed on bool '%s'", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
666 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 Expression checkIntegral()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 if (!type.isintegral())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 error("'%s' is not of integral type, it is a %s", toChars(), type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 return new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 rvalue();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 Expression checkArithmetic()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 if (!type.isintegral() && !type.isfloating())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 error("'%s' is not of arithmetic type, it is a %s", toChars(), type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 return new ErrorExp();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 rvalue();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 void checkDeprecated(Scope sc, Dsymbol s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 s.checkDeprecated(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697 void checkPurity(Scope sc, FuncDeclaration f)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 static if (true) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 if (sc.func)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
702 /* Given:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
703 * void f()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
704 * { pure void g()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
705 * {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
706 * void h()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
707 * {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
708 * void i() { }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
709 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
710 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
711 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
712 * g() can call h() but not f()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
713 * i() can call h() and g() but not f()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
714 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715 FuncDeclaration outerfunc = sc.func;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716 while (outerfunc.toParent2() && outerfunc.toParent2().isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
718 outerfunc = outerfunc.toParent2().isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
719 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
720 if (outerfunc.isPure() && !sc.intypeof && (!f.isNested() && !f.isPure()))
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721 error("pure function '%s' cannot call impure function '%s'\n",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 sc.func.toChars(), f.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
723 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
725 if (sc.func && sc.func.isPure() && !sc.intypeof && !f.isPure())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
726 error("pure function '%s' cannot call impure function '%s'\n",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727 sc.func.toChars(), .toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
728 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
730
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
731 void checkSafety(Scope sc, FuncDeclaration f)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
732 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
733 if (sc.func && sc.func.isSafe() && !sc.intypeof &&
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
734 !f.isSafe() && !f.isTrusted())
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
735 error("safe function '%s' cannot call system function '%s'\n",
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
736 sc.func.toChars(), f.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
737 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
739 /*****************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740 * Check that expression can be tested for true or false.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742 Expression checkToBoolean()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744 // Default is 'yes' - do nothing
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 debug {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747 if (!type)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 if (!type.checkBoolean())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753 error("expression %s of type %s does not have a boolean value", toChars(), type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
755
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759 Expression checkToPointer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760 {
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
761 //writef("Expression::checkToPointer()\n");
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
762 Expression e = this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
764 version(SARRAYVALUE) {} else
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
765 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
766 // If C static array, convert to pointer
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
767 Type tb = type.toBasetype();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
768 if (tb.ty == Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
769 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
770 TypeSArray ts = cast(TypeSArray)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
771 if (ts.size(loc) == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772 e = new NullExp(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
773 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
774 e = new AddrExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 e.type = ts.next.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 }
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 95
diff changeset
777 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
778 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
779 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781 Expression addressOf(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
782 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
783 //printf("Expression::addressOf()\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
784 Expression e = toLvalue(sc, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
785 e = new AddrExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 e.type = type.pointerTo();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
790 /******************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 * If this is a reference, dereference it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 Expression deref()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795 //printf("Expression::deref()\n");
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
796 // type could be null if forward referencing an 'auto' variable
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
797 if (type && type.ty == Treference)
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
798 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 Expression e = new PtrExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800 e.type = (cast(TypeReference)type).next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 * Do integral promotions (convertchk).
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 * Don't convert <array of> to <pointer to>
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 Expression integralPromotions(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 Expression e = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
814 //printf("integralPromotions %s %s\n", e.toChars(), e.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 switch (type.toBasetype().ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 case TY.Tvoid:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 error("void has no value");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
819 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 case TY.Tint8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 case TY.Tuns8:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 case TY.Tint16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 case TY.Tuns16:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 case TY.Tbit:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 case TY.Tbool:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 case TY.Tchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 case TY.Twchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 e = e.castTo(sc, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 case TY.Tdchar:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833 e = e.castTo(sc, Type.tuns32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 break; ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
841 /********************************************
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
842 * Convert from expression to delegate that returns the expression,
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
843 * i.e. convert:
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
844 * expr
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
845 * to:
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
846 * t delegate() { return expr; }
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
847 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 Expression toDelegate(Scope sc, Type t)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 {
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
850 //printf("Expression.toDelegate(t = %s) %s\n", t.toChars(), toChars());
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
851 TypeFunction tf = new TypeFunction(null, t, 0, LINKd);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
852 FuncLiteralDeclaration fld = new FuncLiteralDeclaration(loc, loc, tf, TOKdelegate, null);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
853 Expression e;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
854 static if (true) {
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
855 sc = sc.push();
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
856 sc.parent = fld; // set current function to be the delegate
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
857 e = this;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
858 e.scanForNestedRef(sc);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
859 sc = sc.pop();
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
860 } else {
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
861 e = this.syntaxCopy();
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
862 }
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
863 Statement s = new ReturnStatement(loc, e);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
864 fld.fbody = s;
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
865 e = new FuncExp(loc, fld);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
866 e = e.semantic(sc);
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
867 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870 void scanForNestedRef(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 {
55
8c2c7b7579f8 Expression.toMangleBuffer
korDen
parents: 53
diff changeset
872 //printf("Expression.scanForNestedRef(%s)\n", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
874
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
875 Expression optimize(int result)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
876 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877 //printf("Expression.optimize(result = x%x) %s\n", result, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
878 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
879 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
880
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
881 Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882 {
93
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
883 version(LOG)
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
884 {
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
885 writef("Expression::interpret() %s\n", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
886 writef("type = %s\n", type.toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
887 dump(0);
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
888 }
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
889 error("Cannot interpret %s at compile time", toChars());
df6d0f967680 implemented a whole bunch of methods to make phobos 2.035 compile
Trass3r
parents: 84
diff changeset
890 return EXP_CANT_INTERPRET;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
891 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
892
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
893 int isConst()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
894 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895 //printf("Expression::isConst(): %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
896 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
898
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
899 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 * Does this expression statically evaluate to a boolean TRUE or FALSE?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 bool isBool(bool result)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
907 /********************************
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
908 * Does this expression result in either a 1 or a 0?
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
909 */
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
910 int isBit()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 {
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
912 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
914
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915 /********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 * Check for expressions that have no use.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918 * flag 0 not going to use the result, so issue error message if no
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 * side effects
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 * 1 the result of the expression is used, but still check
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 * for useless subexpressions
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 * 2 do not issue error messages, just return !=0 if expression
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 * has side effects
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925 bool checkSideEffect(int flag)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 if (flag == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
928 {
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
929 if (op == TOKerror)
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
930 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
931 // Error should have already been printed
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
932 }
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 66
diff changeset
933 else if (op == TOKimport)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934 error("%s has no effect", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 error("%s has no effect in expression (%s)",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 Token.toChars(op), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 bool canThrow()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
951 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
953 /****************************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
954 * Resolve __LINE__ and __FILE__ to loc.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
955 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
956 Expression resolveLoc(Loc loc, Scope sc)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
957 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
958 return this;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
959 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
960
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961 int inlineCost(InlineCostState* ics)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 Expression doInline(InlineDoState ids)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 //printf("Expression.doInline(%s): %s\n", Token.toChars(op), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 return copy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 Expression inlineScan(InlineScanState* iss)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978 * Determine if operands of binary op can be reversed
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 * to fit operator overload.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 // For operator overloading
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 bool isCommutative()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 return false; // default is no reverse
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 * Get Identifier for operator overload.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 Identifier opId()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 /***********************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 * Get Identifier for reverse operator overload,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 * null if not supported for this operator.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 Identifier opId_r()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 // For array ops
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1006 /******************************************
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1007 * Construct the identifier for the array operation function,
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1008 * and build the argument list to pass to it.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1009 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 void buildArrayIdent(OutBuffer buf, Expressions arguments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 {
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1012 buf.writestring("Exp");
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1013 arguments.shift(this);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
1016 Expression buildArrayLoop(Parameters fparams)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 {
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1018 Identifier id = Identifier.generateId("c", fparams.dim);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
1019 auto param = new Parameter(STC.STCundefined, type, id, null);
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1020 fparams.shift(param);
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1021 Expression e = new IdentifierExp(Loc(0), id);
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 4
diff changeset
1022 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 }
95
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1024
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1025 /***********************************************
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1026 * Test if operand is a valid array op operand.
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1027 */
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1028 int isArrayOperand()
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1029 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1030 //writef("Expression::isArrayOperand() %s\n", toChars());
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1031 if (op == TOKslice)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1032 return 1;
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1033 if (type.toBasetype().ty == TY.Tarray)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1034 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1035 switch (op)
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1036 {
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1037 case TOKadd:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1038 case TOKmin:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1039 case TOKmul:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1040 case TOKdiv:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1041 case TOKmod:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1042 case TOKxor:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1043 case TOKand:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1044 case TOKor:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1045 case TOKneg:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1046 case TOKtilde:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1047 return 1;
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1048
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1049 default:
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1050 break;
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1051 }
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1052 }
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1053 return 0;
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1054 }
ae5b11064a9a beginning of 2.036 branch
Trass3r
parents: 93
diff changeset
1055
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 // Back end
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057 elem* toElem(IRState* irs)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1058 {
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1059 print();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1060 assert(false);
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1061 return null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 dt_t** toDt(dt_t** pdt)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 {
141
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1066 debug
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1067 {
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1068 writef("Expression::toDt() %d\n", op);
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1069 dump(0);
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1070 }
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1071 error("non-constant expression %s", toChars());
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1072 pdt = dtnzeros(pdt, 1);
7171e6ea651d + Expression.toElem
Trass3r
parents: 135
diff changeset
1073 return pdt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074 }
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 4
diff changeset
1075 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1076
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1077 alias Vector!Expression Expressions;