annotate dmd/VarExp.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 0c8cc2a10f99
children b0d41ff5e0df
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
1 module dmd.VarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 109
diff changeset
3 import dmd.common;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
4 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
5 import dmd.Declaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
6 import dmd.InterState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
7 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
8 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
9 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
10 import dmd.InlineCostState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
11 import dmd.FuncLiteralDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
12 import dmd.VarDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
13 import dmd.Dsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
14 import dmd.FuncDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
15 import dmd.InlineDoState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
16 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
17 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
18 import dmd.TY;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
19 import dmd.STC;
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
20 import dmd.SymbolDeclaration;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
21 import dmd.SymbolExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
22 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
23 import dmd.interpret.Util;
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
24 import dmd.backend.Util;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
25 import dmd.backend.dt_t;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
26 import dmd.expression.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
27
108
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
28 //! Variable
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 class VarExp : SymbolExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 {
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
31 this(Loc loc, Declaration var, bool hasOverloads = false)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 156
diff changeset
33 register();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
34 super(loc, TOK.TOKvar, VarExp.sizeof, var, hasOverloads);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
35
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
36 //printf("VarExp(this = %p, '%s', loc = %s)\n", this, var.toChars(), loc.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
37 //if (strcmp(var.ident.toChars(), "func") == 0) halt();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 this.type = var.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
41 override bool equals(Object o)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 {
156
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
43 VarExp ne;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
44
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
45 if ( this == o ||
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
46 ((cast(Expression)o).op == TOKvar &&
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
47 ((ne = cast(VarExp)o), type.toHeadMutable().equals(ne.type.toHeadMutable())) &&
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
48 var == ne.var))
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
49 return true;
0c8cc2a10f99 + ArrayInitializer.toAssocArrayLiteral()
trass3r
parents: 148
diff changeset
50 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
53 override Expression semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
55 FuncLiteralDeclaration fd;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
56
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
57 version (LOGSEMANTIC) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
58 printf("VarExp.semantic(%s)\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
59 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
60 if (!type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
61 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
62 type = var.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
63 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
64 if (var.storage_class & STC.STClazy)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
65 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
66 TypeFunction tf = new TypeFunction(null, type, 0, LINK.LINKd);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
67 type = new TypeDelegate(tf);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
68 type = type.semantic(loc, sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
69 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
70 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
71 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
73 /* Fix for 1161 doesn't work because it causes protection
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
74 * problems when instantiating imported templates passing private
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
75 * variables as alias template parameters.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
76 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
77 //accessCheck(loc, sc, null, var);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
78
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
79 VarDeclaration v = var.isVarDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
80 if (v)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
81 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
82 static if (false) {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
83 if ((v.isConst() || v.isImmutable()) && type.toBasetype().ty != TY.Tsarray && v.init)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
84 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
85 ExpInitializer ei = v.init.isExpInitializer();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
86 if (ei)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
87 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
88 //ei.exp.implicitCastTo(sc, type).print();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
89 return ei.exp.implicitCastTo(sc, type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
90 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
91 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
92 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
93 v.checkNestedReference(sc, loc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
94 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
95 static if (true) {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
96 if (sc.func && !sc.intypeof)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
97 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
98 /* Given:
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
99 * void f()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
100 * { int fx;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
101 * pure void g()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
102 * { int gx;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
103 * void h()
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
104 * { int hx;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
105 * void i() { }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
106 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
107 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
108 * }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
109 * i() can modify hx and gx but not fx
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
110 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
111
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
112 /* Determine if sc.func is pure or if any function that
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
113 * encloses it is also pure.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
114 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
115 bool hasPureParent = false;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
116 for (FuncDeclaration outerfunc = sc.func; outerfunc;)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
117 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
118 if (outerfunc.isPure())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
119 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
120 hasPureParent = true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
121 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
122 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
123 Dsymbol parent = outerfunc.toParent2();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
124 if (!parent)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
125 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
126 outerfunc = parent.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
127 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
128
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
129 /* If ANY of its enclosing functions are pure,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
130 * it cannot do anything impure.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
131 * If it is pure, it cannot access any mutable variables other
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
132 * than those inside itself
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
133 */
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
134 if (hasPureParent && v.isDataseg() && !v.isImmutable())
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
135 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
136 error("pure function '%s' cannot access mutable static data '%s'",
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
137 sc.func.toChars(), v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
138 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
139 else if (sc.func.isPure() && sc.parent != v.parent && !v.isImmutable() && !(v.storage_class & STC.STCmanifest))
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
140 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
141 error("pure nested function '%s' cannot access mutable data '%s'", sc.func.toChars(), v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
142 if (v.isEnumDeclaration())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
143 error("enum");
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
144 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
145
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
146 /* Do not allow safe functions to access __gshared data
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
147 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
148 if (sc.func.isSafe() && v.storage_class & STCgshared)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
149 error("safe function '%s' cannot access __gshared data '%s'",
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
150 sc.func.toChars(), v.toChars());
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
151 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
152 } else {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
153 if (sc.func && sc.func.isPure() && !sc.intypeof)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
154 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
155 if (v.isDataseg() && !v.isImmutable())
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
156 error("pure function '%s' cannot access mutable static data '%s'", sc.func.toChars(), v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
157 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
158 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
159 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
160 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
161 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
162 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
163 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
164 if ((fd = var.isFuncLiteralDeclaration()) !is null)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
165 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
166 Expression e = new FuncExp(loc, fd);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
167 e.type = type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
168 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
169 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
170 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
171 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
172
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
176 override Expression optimize(int result)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 return fromConstInitializer(result, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
181 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
183 version (LOG) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
184 printf("VarExp.interpret() %.*s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
185 }
63
cab4c37afb89 A bunch of implementations
korDen
parents: 45
diff changeset
186 return getVarExp(loc, istate, var);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
189 override void dump(int indent)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
194 override string toChars()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 return var.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
199 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 buf.writestring(var.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
204 override void checkEscape()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
206 VarDeclaration v = var.isVarDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
207 if (v)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
208 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
209 Type tb = v.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
210 // if reference type
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
211 if (tb.ty == TY.Tarray || tb.ty == TY.Tsarray || tb.ty == TY.Tclass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
212 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
213 if ((v.isAuto() || v.isScope()) && !v.noauto)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
214 error("escaping reference to scope local %s", v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
215 else if (v.storage_class & STC.STCvariadic)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
216 error("escaping reference to variadic parameter %s", v.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
217 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
220
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
221 override void checkEscapeRef()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
222 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
223 VarDeclaration v = var.isVarDeclaration();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
224 if (v)
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
225 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
226 if (!v.isDataseg() && !(v.storage_class & (STCref | STCout)))
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
227 error("escaping reference to local variable %s", v.toChars());
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
228 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
229 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
230
108
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
231 version (DMDV2)
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
232 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
233 override int isLvalue()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
235 if (var.storage_class & STClazy)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
236 return 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
240 override Expression toLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
242 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
243 tym = tybasic(e1.ET.Tty);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
244 if (!(tyscalar(tym) ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
245 tym == TYM.TYstruct ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
246 tym == TYM.TYarray && e.Eoper == TOK.TOKaddr))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
247 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
248 synerr(EM_lvalue); // lvalue expected
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
249 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
250 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
251 if (var.storage_class & STC.STClazy)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
252 error("lazy variables cannot be lvalues");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
253
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
257 override Expression modifiableLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
259 //printf("VarExp::modifiableLvalue('%s')\n", var.toChars());
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 108
diff changeset
260 //if (type && type.toBasetype().ty == TY.Tsarray)
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 108
diff changeset
261 // error("cannot change reference to static array '%s'", var.toChars());
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
262
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
263 var.checkModify(loc, sc, type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
264
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
265 // See if this expression is a modifiable lvalue (i.e. not const)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 return toLvalue(sc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
269 override dt_t** toDt(dt_t** pdt)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 {
148
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
271 // writef("VarExp::toDt() %d\n", op);
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
272 for (; *pdt; pdt = &((*pdt).DTnext))
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
273 {}
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
274
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
275 VarDeclaration v = var.isVarDeclaration();
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
276 if (v && (v.isConst() || v.isImmutable()) &&
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
277 type.toBasetype().ty != Tsarray && v.init)
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
278 {
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
279 if (v.inuse)
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
280 {
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
281 error("recursive reference %s", toChars());
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
282 return pdt;
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
283 }
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
284 v.inuse++;
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
285 *pdt = v.init.toDt();
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
286 v.inuse--;
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
287 return pdt;
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
288 }
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
289 SymbolDeclaration sd = var.isSymbolDeclaration();
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
290 if (sd && sd.dsym)
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
291 {
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
292 sd.dsym.toDt(pdt);
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
293 return pdt;
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
294 }
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
295 debug writef("VarExp::toDt(), kind = %s\n", var.kind());
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
296
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
297 error("non-constant expression %s", toChars());
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
298 pdt = dtnzeros(pdt, 1);
fe2e1b93e88f phobos compiles now:
Trass3r
parents: 135
diff changeset
299 return pdt;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301
108
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
302 version(DMDV1)
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
303 override elem* toElem(IRState* irs)
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
304 {
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
305 assert(false);
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
306 }
6da99741178e e2ir.c changes, mainly accounts for static arrays being value types now
Trass3r
parents: 73
diff changeset
307
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
308 override void scanForNestedRef(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
310 //printf("VarExp.scanForNestedRef(%s)\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
311 VarDeclaration v = var.isVarDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
312 if (v)
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
313 v.checkNestedReference(sc, Loc(0));
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
316 override int inlineCost(InlineCostState* ics)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
318 //printf("VarExp.inlineCost() %s\n", toChars());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
322 override Expression doInline(InlineDoState ids)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
324 int i;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
325
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
326 //printf("VarExp.doInline(%s)\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
327 for (i = 0; i < ids.from.dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
328 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
329 if (var == cast(Declaration)ids.from.data[i])
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
330 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
331 VarExp ve = cast(VarExp)copy();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
332
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
333 ve.var = cast(Declaration)ids.to.data[i];
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
334 return ve;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
335 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 64
diff changeset
336 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 return this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340