annotate dmd/VarDeclaration.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 b7b61140701d
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.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 113
diff changeset
3 import dmd.common;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
4 import dmd.Array;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Declaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.SliceExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.ClassDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.DeleteExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.SymOffExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.DotIdExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.PtrExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.CallExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.DotVarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.CommaExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.CastExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.StructDeclaration;
68
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
18 import dmd.StorageClassDeclaration;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.DsymbolExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22 import dmd.VarExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.AssignExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.TypeTypedef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.ArrayInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.StructInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.NewExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.TupleDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.AggregateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.InterfaceDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.Id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.Initializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.TypeStruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.TypeTuple;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
36 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.ExpInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TOK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.TupleExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 import dmd.Global;
22
fd4acc376c45 Implemented object file output and linking on linux.
Robert Clipsham <robert@octarineparrot.com>
parents: 16
diff changeset
46 import dmd.Module;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 import dmd.LINK;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 import dmd.PROT;
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
56 import dmd.expression.Util;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58 import dmd.backend.Symbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 import dmd.backend.TYM;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 import dmd.backend.FL;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 import dmd.backend.DT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 import dmd.backend.mTY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63 import dmd.backend.SC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 import dmd.backend.mTYman;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 import dmd.backend.TYPE;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 import dmd.backend.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 import dmd.backend.LIST;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 import std.stdio : writef;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 import std.string : toStringz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 class VarDeclaration : Declaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 Initializer init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 uint offset;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 bool noauto; // no auto semantics
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 version (DMDV2) {
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
78 FuncDeclarations nestedrefs; // referenced by these lexically nested functions
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
79 bool isargptr = false; // if parameter that _argptr points to
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 int nestedref; // referenced by a lexically nested function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 int ctorinit; // it has been initialized in a ctor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 int onstack; // 1: it has been allocated on the stack
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85 // 2: on stack, run destructor anyway
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 int canassign; // it can be assigned to
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 Dsymbol aliassym; // if redone as alias to another symbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 Expression value; // when interpreting, this is the value
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 // (null if value not determinable)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 VarDeclaration rundtor; // if !null, rundtor is tested at runtime to see
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 // if the destructor should be run. Used to prevent
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 // dtor calls on postblitted vars
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 this(Loc loc, Type type, Identifier id, Initializer init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 157
diff changeset
98 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 super(id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
101 debug
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
102 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 if (!type && !init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 writef("VarDeclaration('%s')\n", id.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 //*(char*)0=0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 assert(type || init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 this.type = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 this.init = init;
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
112 version(_DH)
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
113 {
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
114 this.htype = null;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
115 this.hinit = null;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
116 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
119 /* TODO:
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
120 #if DMDV1
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
121 nestedref = 0;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
122 #endif
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
123 ctorinit = 0;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
124 aliassym = NULL;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
125 onstack = 0;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
126 canassign = 0;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
127 value = NULL;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
128 rundtor = NULL;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
129 */
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 nestedrefs = new FuncDeclarations();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
133 override Dsymbol syntaxCopy(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 //printf("VarDeclaration.syntaxCopy(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 VarDeclaration sv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 if (s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 sv = cast(VarDeclaration)s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 Initializer init = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 if (this.init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 init = this.init.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 //init.isExpInitializer().exp.print();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 //init.isExpInitializer().exp.dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 sv = new VarDeclaration(loc, type ? type.syntaxCopy() : null, ident, init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 sv.storage_class = storage_class;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
156 version (_DH) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 // Syntax copy for header file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 if (!htype) // Don't overwrite original
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 if (type) // Make copy for both old and new instances
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 { htype = type.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162 sv.htype = type.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165 else // Make copy of original for new instance
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 sv.htype = htype.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 if (!hinit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 hinit = init.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 sv.hinit = init.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 sv.hinit = hinit.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 return sv;
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: 68
diff changeset
181 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 printf("VarDeclaration.semantic('%s', parent = '%s')\n", toChars(), sc.parent.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 printf(" type = %s\n", type ? type.toChars() : "null");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 printf(" stc = x%x\n", sc.stc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 printf(" storage_class = x%x\n", storage_class);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 printf("linkage = %d\n", sc.linkage);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 //if (strcmp(toChars(), "mul") == 0) halt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 storage_class |= sc.stc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 if (storage_class & STC.STCextern && init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 error("extern symbols cannot have initializers");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 /* If auto type inference, do the inference
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 int inferred = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 if (!type)
157
b7b61140701d * added all missing default cases in switch statements
trass3r
parents: 135
diff changeset
200 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 inuse++;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
202
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
203 ArrayInitializer ai = init.isArrayInitializer();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
204 if (ai)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
205 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
206 Expression e;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
207 if (ai.isAssociativeArray())
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
208 e = ai.toAssocArrayLiteral();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
209 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
210 e = init.toExpression();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
211 init = new ExpInitializer(e.loc, e);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
212 type = init.inferType(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
213 if (type.ty == TY.Tsarray)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
214 type = type.nextOf().arrayOf();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
215 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
216 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
217 type = init.inferType(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
218
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 inuse--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 inferred = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
222 if (init.isArrayInitializer() && type.toBasetype().ty == TY.Tsarray)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
223 { // Prefer array literals to give a T[] type rather than a T[dim]
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
224 type = type.toBasetype().nextOf().arrayOf();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
225 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
226
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 /* This is a kludge to support the existing syntax for RAII
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 * declarations.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 storage_class &= ~STC.STCauto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 originalType = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 if (!originalType)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 originalType = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 type = type.semantic(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 //printf(" semantic type = %s\n", type ? type.toChars() : "null");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 type.checkDeprecated(loc, sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 linkage = sc.linkage;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244 this.parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 //printf("this = %p, parent = %p, '%s'\n", this, parent, parent.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 protection = sc.protection;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 //printf("sc.stc = %x\n", sc.stc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 //printf("storage_class = x%x\n", storage_class);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 version (DMDV2) {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
251 static if (true) {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
252 if (storage_class & STC.STCgshared && sc.func && sc.func.isSafe())
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
253 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
254 error("__gshared not allowed in safe functions; use shared");
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
255 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
256 } else {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 if (storage_class & STC.STCgshared && global.params.safe && !sc.module_.safe)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 error("__gshared not allowed in safe mode; use shared");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
262 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 Dsymbol parent = toParent();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 FuncDeclaration fd = parent.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 Type tb = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 if (tb.ty == TY.Tvoid && !(storage_class & STC.STClazy))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 { error("voids have no value");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271 tb = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 if (tb.ty == TY.Tfunction)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 { error("cannot be declared to be a function");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 tb = type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 if (tb.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279 { TypeStruct ts = cast(TypeStruct)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 if (!ts.sym.members)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 error("no definition of struct %s", ts.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 if (tb.ty == TY.Ttuple)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 { /* Instead, declare variables for each of the tuple elements
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289 * and add those.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 TypeTuple tt = cast(TypeTuple)tb;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
292 size_t nelems = Parameter.dim(tt.arguments);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 Objects exps = new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 exps.setDim(nelems);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 Expression ie = init ? init.toExpression() : null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 for (size_t i = 0; i < nelems; i++)
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
298 { auto arg = Parameter.getNth(tt.arguments, i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
300 auto buf = new OutBuffer();
53
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 23
diff changeset
301 ///buf.printf("_%s_field_%zu", ident.toChars(), i);
a8b50ff7f201 ForeachStatement.syntaxCopy
korDen
parents: 23
diff changeset
302 buf.printf("_%s_field_%s", ident.toChars(), i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303 buf.writeByte(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 string name = buf.extractString();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 Identifier id = new Identifier(name, TOK.TOKidentifier);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 Expression einit = ie;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 if (ie && ie.op == TOK.TOKtuple)
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
309 { einit = (cast(TupleExp)ie).exps[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 Initializer ti = init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 if (einit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 { ti = new ExpInitializer(einit.loc, einit);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
316 auto v = new VarDeclaration(loc, arg.type, id, ti);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 //printf("declaring field %s of type %s\n", v.toChars(), v.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 v.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 if (sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 { //printf("adding %s to %s\n", v.toChars(), sc.scopesym.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 if (sc.scopesym.members)
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
323 sc.scopesym.members.push(v);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 88
diff changeset
326 auto e = new DsymbolExp(loc, v);
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 88
diff changeset
327 exps[i] = e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328 }
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 88
diff changeset
329 auto v2 = new TupleDeclaration(loc, ident, exps);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 v2.isexp = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 aliassym = v2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 Lagain:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 /* Storage class can modify the type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 type = type.addStorageClass(storage_class);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 /* Adjust storage class to reflect type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 if (type.isConst())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 { storage_class |= STC.STCconst;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344 if (type.isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 storage_class |= STC.STCshared;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
347 else if (type.isImmutable())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348 storage_class |= STC.STCimmutable;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 else if (type.isShared())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 storage_class |= STC.STCshared;
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
351 else if (type.isWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
352 storage_class |= STC.STCwild;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 if (isSynchronized())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 error("variable %s cannot be synchronized", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358 else if (isOverride())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 error("override cannot be applied to variable");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 else if (isAbstract())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 error("abstract cannot be applied to variable");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 else if (storage_class & STC.STCfinal)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 error("final cannot be applied to variable");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 if (storage_class & (STC.STCstatic | STC.STCextern | STC.STCmanifest | STC.STCtemplateparameter | STC.STCtls | STC.STCgshared))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376 AggregateDeclaration aad = sc.anonAgg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 if (!aad)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 aad = parent.isAggregateDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 if (aad)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 ///version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382 assert(!(storage_class & (STC.STCextern | STC.STCstatic | STC.STCtls | STC.STCgshared)));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 if (storage_class & (STC.STCconst | STC.STCimmutable) && init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 if (!type.toBasetype().isTypeBasic())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387 storage_class |= STC.STCstatic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 ///}
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 aad.addField(sc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 InterfaceDeclaration id = parent.isInterfaceDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 if (id)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 error("field not allowed in interface");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
399
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
400 /* Templates cannot add fields to aggregates
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
402 TemplateInstance ti = parent.isTemplateInstance();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
403 if (ti)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
404 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 // Take care of nested templates
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
407 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 TemplateInstance ti2 = ti.tempdecl.parent.isTemplateInstance();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
409 if (!ti2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
410 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
411 ti = ti2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
412 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
413
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
414 // If it's a member template
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
415 AggregateDeclaration ad = ti.tempdecl.isMember();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
416 if (ad && storage_class != STC.STCundefined)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
417 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
418 error("cannot use template to add field to aggregate '%s'", ad.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
419 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
420 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
421 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
422
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
423 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
424 if ((storage_class & (STC.STCref | STC.STCparameter | STC.STCforeach)) == STC.STCref && ident != Id.This)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
425 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
426 error("only parameters or foreach declarations can be ref");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
427 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
428
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
429 if ((storage_class & (STCstatic | STCextern | STCtls | STCgshared | STCmanifest) ||
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
430 isDataseg()) &&
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
431 type.hasWild())
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
432 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
433 error("only fields, parameters or stack based variables can be inout");
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
434 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 if (type.isauto() && !noauto)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
438 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
439 if (storage_class & (STC.STCfield | STC.STCout | STC.STCref | STC.STCstatic | STC.STCmanifest | STC.STCtls | STC.STCgshared) || !fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 error("globals, statics, fields, manifest constants, ref and out parameters cannot be scope");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 if (!(storage_class & (STC.STCauto | STC.STCscope)))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 if (!(storage_class & STC.STCparameter) && ident != Id.withSym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 error("reference to scope class must be scope");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
451 if ((isConst() || isImmutable()) && !init && !fd)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
452 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 // Initialize by constructor only
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 storage_class |= STC.STCctorinit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
458 storage_class |= STC.STCinit; // remember we had an explicit initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 else if (storage_class & STC.STCmanifest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460 error("manifest constants must have initializers");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 TOK op = TOK.TOKconstruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 if (!init && !sc.inunion && !isStatic() && fd &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 (!(storage_class & (STC.STCfield | STC.STCin | STC.STCforeach | STC.STCparameter)) || (storage_class & STC.STCout)) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 type.size() != 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467 // Provide a default initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 //printf("Providing default initializer for '%s'\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 if (type.ty == TY.Tstruct &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470 (cast(TypeStruct)type).sym.zeroInit)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 { /* If a struct is all zeros, as a special case
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 * set it's initializer to the integer 0.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 * In AssignExp.toElem(), we check for this and issue
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 * a memset() to initialize the struct.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
475 * Must do same check in interpreter.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
477 Expression e = new IntegerExp(loc, 0, Type.tint32);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 Expression e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479 e1 = new VarExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 e = new AssignExp(loc, e1, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 e.op = TOK.TOKconstruct;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482 e.type = e1.type; // don't type check this, it would fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 init = new ExpInitializer(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 else if (type.ty == TY.Ttypedef)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 { TypeTypedef td = cast(TypeTypedef)type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 if (td.sym.init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489 { init = td.sym.init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 ExpInitializer ie = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 if (ie)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 // Make copy so we can modify it
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 init = new ExpInitializer(ie.loc, ie.exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
495 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 init = getExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 init = getExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 // Default initializer is always a blit
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 op = TOK.TOKblit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 sc = sc.push();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 sc.stc &= ~(STC.STC_TYPECTOR | STC.STCpure | STC.STCnothrow | STC.STCref);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 ArrayInitializer ai = init.isArrayInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512 if (ai && tb.ty == TY.Taarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
514 Expression e = ai.toAssocArrayLiteral();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
515 init = new ExpInitializer(e.loc, e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 StructInitializer si = init.isStructInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 ExpInitializer ei = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 // See if initializer is a NewExp that can be allocated on the stack
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 if (ei && isScope() && ei.exp.op == TOK.TOKnew)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523 { NewExp ne = cast(NewExp)ei.exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 if (!(ne.newargs && ne.newargs.dim))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 { ne.onstack = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 onstack = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 if (type.isBaseOf(ne.newtype.semantic(loc, sc), null))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 onstack = 2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 // If inside function, there is no semantic3() call
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 if (sc.func)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 // If local variable, use AssignExp to handle all the various
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 // possibilities.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
537 if (fd &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538 !(storage_class & (STC.STCmanifest | STC.STCstatic | STC.STCtls | STC.STCgshared | STC.STCextern)) &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 !init.isVoidInitializer())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
540 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 //printf("fd = '%s', var = '%s'\n", fd.toChars(), toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 if (!ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544 Expression e = init.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 if (!e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 init = init.semantic(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 e = init.toExpression();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
549 if (!e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 { error("is not a static and cannot have static initializer");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 ei = new ExpInitializer(init.loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 init = ei;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 Expression e1 = new VarExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 Type t = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561 if (t.ty == TY.Tsarray && !(storage_class & (STC.STCref | STC.STCout)))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 ei.exp = ei.exp.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564 if (!ei.exp.implicitConvTo(type))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 int dim = cast(int)(cast(TypeSArray)t).dim.toInteger(); ///
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 // If multidimensional static array, treat as one large array
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 while (1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 t = t.nextOf().toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 if (t.ty != TY.Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 dim *= (cast(TypeSArray)t).dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 e1.type = new TypeSArray(t.nextOf(), new IntegerExp(Loc(0), dim, Type.tindex));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 e1 = new SliceExp(loc, e1, null, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 else if (t.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 ei.exp = ei.exp.semantic(sc);
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
582 ei.exp = resolveProperties(sc, ei.exp);
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
583 StructDeclaration sd = (cast(TypeStruct)t).sym;
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
584 version (DMDV2)
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
585 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 /* Look to see if initializer is a call to the constructor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 if (sd.ctor && // there are constructors
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589 ei.exp.type.ty == TY.Tstruct && // rvalue is the same struct
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 (cast(TypeStruct)ei.exp.type).sym == sd &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 ei.exp.op == TOK.TOKstar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 /* Look for form of constructor call which is:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594 * *__ctmp.ctor(arguments...)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 PtrExp pe = cast(PtrExp)ei.exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 if (pe.e1.op == TOK.TOKcall)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 { CallExp ce = cast(CallExp)pe.e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 if (ce.e1.op == TOK.TOKdotvar)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600 { DotVarExp dve = cast(DotVarExp)ce.e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 if (dve.var.isCtorDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 { /* It's a constructor call, currently constructing
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 * a temporary __ctmp.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 /* Before calling the constructor, initialize
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 * variable with a bit copy of the default
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 * initializer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
609 Expression e = new AssignExp(loc, new VarExp(loc, this), t.defaultInit(loc));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
610 e.op = TOK.TOKblit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
611 e.type = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
612 ei.exp = new CommaExp(loc, e, ei.exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
613
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
614 /* Replace __ctmp being constructed with e1
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
615 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 dve.e1 = e1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
617 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
618 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
619 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
620 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
621 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
622 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
623 if (!ei.exp.implicitConvTo(type))
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
624 {
103
e6090d1aea7c fixed dmd.Id + some small fixups
Trass3r
parents: 98
diff changeset
625 Type ti = ei.exp.type.toBasetype();
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
626 // Look for constructor first
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
627 if (sd.ctor &&
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
628 /* Initializing with the same type is done differently
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
629 */
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
630 !(ti.ty == Tstruct && t.toDsymbol(sc) == ti.toDsymbol(sc)))
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
631 {
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
632 // Rewrite as e1.ctor(arguments)
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
633 Expression ector = new DotIdExp(loc, e1, Id.ctor);
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
634 ei.exp = new CallExp(loc, ector, ei.exp);
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
635 }
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
636 else
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
637 /* Look for opCall
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
638 * See bugzilla 2702 for more discussion
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
639 */
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
640
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
641 // Don't cast away invariant or mutability in initializer
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
642 if (search_function(sd, Id.call) &&
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
643 /* Initializing with the same type is done differently
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
644 */
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
645 !(ti.ty == Tstruct && t.toDsymbol(sc) == ti.toDsymbol(sc)))
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
646 { // Rewrite as e1.call(arguments)
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
647 Expression eCall = new DotIdExp(loc, e1, Id.call);
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
648 ei.exp = new CallExp(loc, eCall, ei.exp);
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
649 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
650 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
651 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
652 ei.exp = new AssignExp(loc, e1, ei.exp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
653 ei.exp.op = op;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
654 canassign++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
655 ei.exp = ei.exp.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
656 canassign--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
657 ei.exp.optimize(WANT.WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
658 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
659 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
660 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
661 init = init.semantic(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
662 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
663 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
664 else if (storage_class & (STC.STCconst | STC.STCimmutable | STC.STCmanifest) ||
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
665 type.isConst() || type.isImmutable() ||
98
5c859d5fbe27 and more
Trass3r
parents: 88
diff changeset
666 parent.isAggregateDeclaration())
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
667 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
668 /* Because we may need the results of a const declaration in a
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
669 * subsequent type, such as an array dimension, before semantic2()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 * gets ordinarily run, try to run semantic2() now.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671 * Ignore failure.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 if (!global.errors && !inferred)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 uint errors = global.errors;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 global.gag++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 //printf("+gag\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 Expression e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 Initializer i2 = init;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 inuse++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 if (ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
684 e = ei.exp.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 e = e.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 e = e.implicitCastTo(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 else if (si || ai)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 { i2 = init.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 i2 = i2.semantic(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 inuse--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
693 global.gag--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 //printf("-gag\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 if (errors != global.errors) // if errors happened
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
697 if (global.gag == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
698 global.errors = errors; // act as if nothing happened
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 /* Save scope for later use, to try again
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 */
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 77
diff changeset
702 scope_ = sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
704 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
705 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
706 else if (ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
707 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
708 if (isDataseg())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
709 /* static const/invariant does CTFE
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
710 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
711 e = e.optimize(WANT.WANTvalue | WANT.WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
712 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
713 e = e.optimize(WANT.WANTvalue);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
714 if (e.op == TOK.TOKint64 || e.op == TOK.TOKstring || e.op == TOK.TOKfloat64)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716 ei.exp = e; // no errors, keep result
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
718 ///version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
719 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
720 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721 /* Save scope for later use, to try again
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 */
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 77
diff changeset
723 scope_ = sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724 scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
725 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
726 ///}
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
728 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 init = i2; // no errors, keep result
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
730 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
731 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
732 sc = sc.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
733 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
734 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
735
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
736 override void semantic2(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
737 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738 //printf("VarDeclaration.semantic2('%s')\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
739 if (init && !toParent().isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
740 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 inuse++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
742 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 ExpInitializer ei = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744 if (ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 ei.exp.dump(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747 printf("type = %p\n", ei.exp.type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 init = init.semantic(sc, type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 inuse--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
753 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
755 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 return "variable";
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
760 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
761 {
68
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
762 StorageClassDeclaration.stcToCBuffer(buf, storage_class);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
763
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
764 /* If changing, be sure and fix CompoundDeclarationStatement.toCBuffer()
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
765 * too.
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
766 */
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
767 if (type)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
768 type.toCBuffer(buf, ident, hgs);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
769 else
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
770 buf.writestring(ident.toChars());
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
771 if (init)
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
772 {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
773 buf.writestring(" = ");
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
774 ///version (DMDV2) {
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
775 ExpInitializer ie = init.isExpInitializer();
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
776 if (ie && (ie.exp.op == TOKconstruct || ie.exp.op == TOKblit))
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
777 (cast(AssignExp)ie.exp).e2.toCBuffer(buf, hgs);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
778 else
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
779 ///}
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
780 init.toCBuffer(buf, hgs);
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
781 }
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
782 buf.writeByte(';');
ee3a9f34dc48 final bits of codegen implementation to compile Phobos
korDen
parents: 53
diff changeset
783 buf.writenl();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
784 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
785
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 version (_DH) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 Type htype;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 Initializer hinit;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
790 override bool needThis()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
791 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 //printf("VarDeclaration.needThis(%s, x%x)\n", toChars(), storage_class);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 return (storage_class & STC.STCfield) != 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
796 override bool isImportedSymbol()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 if (protection == PROT.PROTexport && !init && (storage_class & STC.STCstatic || parent.isModule()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
801 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
802 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
804 override bool isDataseg()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 printf("VarDeclaration.isDataseg(%p, '%s')\n", this, toChars());
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
808 printf("%llx, isModule: %p, isTemplateInstance: %p\n", storage_class & (STC.STCstatic | STC.STCconst), parent.isModule(), parent.isTemplateInstance());
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 printf("parent = '%s'\n", parent.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 if (storage_class & STC.STCmanifest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
813
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
814 Dsymbol parent = this.toParent();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
815 if (!parent && !(storage_class & STC.STCstatic))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
816 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
817 error("forward referenced");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 type = Type.terror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
819 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 return canTakeAddressOf() && (storage_class & (STC.STCstatic | STC.STCextern | STC.STCtls | STC.STCgshared) || toParent().isModule() || toParent().isTemplateInstance());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
825 override bool isThreadlocal()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 //printf("VarDeclaration.isThreadlocal(%p, '%s')\n", this, toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 static if (false) { /// || TARGET_OSX
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 /* To be thread-local, must use the __thread storage class.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 * BUG: OSX doesn't support thread local yet.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 return isDataseg() && (storage_class & (STC.STCtls | STC.STCconst | STC.STCimmutable | STC.STCshared | STC.STCgshared)) == STC.STCtls;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 /* Data defaults to being thread-local. It is not thread-local
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 * if it is immutable, const or shared.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
837 bool i = isDataseg() && !(storage_class & (STC.STCimmutable | STC.STCconst | STC.STCshared | STC.STCgshared));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 //printf("\treturn %d\n", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839 return i;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
841 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
843 /********************************************
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
844 * Can variable be read and written by CTFE?
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
845 */
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
846
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
847 int isCTFE()
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
848 {
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
849 return (storage_class & STCctfe) || !isDataseg();
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
850 }
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
851
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
852 override bool hasPointers()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 //printf("VarDeclaration.hasPointers() %s, ty = %d\n", toChars(), type.ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 return (!isDataseg() && type.hasPointers());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
857
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
858 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
859 bool canTakeAddressOf()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
861 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
862 /* Global variables and struct/class fields of the form:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
863 * const int x = 3;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864 * are not stored and hence cannot have their address taken.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865 */
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
866 if ((isConst() || isImmutable()) && (storage_class & STC.STCinit) && (!(storage_class & (STC.STCstatic | STC.STCextern)) || (storage_class & STC.STCfield)) &&
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
867 (!parent || toParent().isModule() || toParent().isTemplateInstance()) && type.toBasetype().isTypeBasic())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
872 if (storage_class & STC.STCmanifest)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 return false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
874 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
875 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
876 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
878 /******************************************
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
879 * Return TRUE if variable needs to call the destructor.
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
880 */
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
881 bool needsAutoDtor()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882 {
12
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
883 //printf("VarDeclaration.needsAutoDtor() %s\n", toChars());
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
884
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
885 if (noauto || storage_class & STCnodtor)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
886 return false;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
887
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
888 // Destructors for structs and arrays of structs
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
889 Type tv = type.toBasetype();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
890 while (tv.ty == Tsarray)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
891 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
892 TypeSArray ta = cast(TypeSArray)tv;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
893 tv = tv.nextOf().toBasetype();
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
894 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
895 if (tv.ty == Tstruct)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
896 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
897 TypeStruct ts = cast(TypeStruct)tv;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
898 StructDeclaration sd = ts.sym;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
899 if (sd.dtor)
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
900 return true;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
901 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
902
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
903 // Destructors for classes
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
904 if (storage_class & (STCauto | STCscope))
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
905 {
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
906 if (type.isClassHandle())
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
907 return true;
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
908 }
832f71e6f96c *Exp and *AssignExp arrayOp implementation added (might be a bit incomplete)
korDen
parents: 0
diff changeset
909 return false;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913 /******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
914 * If a variable has an auto destructor call, return call for it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915 * Otherwise, return null.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 Expression callAutoDtor(Scope sc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 Expression e = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 //printf("VarDeclaration.callAutoDtor() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 if (noauto || storage_class & STC.STCnodtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 // Destructors for structs and arrays of structs
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 bool array = false;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
928 Type tv = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 while (tv.ty == TY.Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
931 TypeSArray ta = cast(TypeSArray)tv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 array = true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933 tv = tv.nextOf().toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 if (tv.ty == TY.Tstruct)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 TypeStruct ts = cast(TypeStruct)tv;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 StructDeclaration sd = ts.sym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 if (sd.dtor)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 if (array)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 // Typeinfo.destroy(cast(void*)&v);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 Expression ea = new SymOffExp(loc, this, 0, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 ea = new CastExp(loc, ea, Type.tvoid.pointerTo());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 Expressions args = new Expressions();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
947 args.push(ea);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 Expression et = type.getTypeInfo(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950 et = new DotIdExp(loc, et, Id.destroy);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
951
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952 e = new CallExp(loc, et, args);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
953 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
954 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
955 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956 e = new VarExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 e = new DotVarExp(loc, e, sd.dtor, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 e = new CallExp(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
962 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 // Destructors for classes
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965 if (storage_class & (STC.STCauto | STC.STCscope))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 for (ClassDeclaration cd = type.isClassHandle(); cd; cd = cd.baseClass)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 /* We can do better if there's a way with onstack
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970 * classes to determine if there's no way the monitor
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971 * could be set.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 //if (cd.isInterfaceDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 //error("interface %s cannot be scope", cd.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 if (1 || onstack || cd.dtors.dim) // if any destructors
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 // delete this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978 Expression ec = new VarExp(loc, this);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 e = new DeleteExp(loc, ec);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 e.type = Type.tvoid;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 return e;
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 ExpInitializer for a variable, if there is one.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 ExpInitializer getExpInitializer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 ExpInitializer ei;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 ei = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 Expression e = type.defaultInit(loc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 if (e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 ei = new ExpInitializer(loc, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003 ei = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 return ei;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008 /*******************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 * If variable has a constant expression initializer, get it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 * Otherwise, return null.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 Expression getConstInitializer()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
1014 if ((isConst() || isImmutable() || storage_class & STC.STCmanifest) && storage_class & STC.STCinit)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 ExpInitializer ei = getExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 if (ei)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 return ei.exp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1024 override void checkCtorConstInit()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026 static if (false) { /* doesn't work if more than one static ctor */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027 if (ctorinit == 0 && isCtorinit() && !(storage_class & STCfield))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1028 error("missing initializer in static constructor for const variable");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 /************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 * Check to see if this variable is actually in an enclosing function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 * rather than the current one.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 void checkNestedReference(Scope sc, Loc loc)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 if (parent && !isDataseg() && parent != sc.parent && !(storage_class & STC.STCmanifest))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 // The function that this variable is in
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041 FuncDeclaration fdv = toParent().isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 // The current function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 FuncDeclaration fdthis = sc.parent.isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045 if (fdv && fdthis && fdv !is fdthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1047 if (loc.filename)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048 fdthis.getLevel(loc, fdv);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
1050 foreach (f; nestedrefs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052 if (f == fdthis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1053 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 }
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1055 nestedrefs.push(fdthis);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 L1: ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
1058 foreach (s; fdv.closureVars)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1059 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1060 if (s == this)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 73
diff changeset
1064 fdv.closureVars.push(this);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 L2: ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 //printf("fdthis is %s\n", fdthis.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 //printf("var %s in function %s is nested ref\n", toChars(), fdv.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1071 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1073 override Dsymbol toAlias()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1075 //printf("VarDeclaration::toAlias('%s', this = %p, aliassym = %p)\n", toChars(), this, aliassym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076 assert(this !is aliassym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 return aliassym ? aliassym.toAlias() : this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1079
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1080 override Symbol* toSymbol()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 //printf("VarDeclaration.toSymbol(%s)\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083 //if (needThis()) *(char*)0=0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1084 assert(!needThis());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 if (!csym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1086 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1087 Symbol* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1088 TYPE* t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089 string id;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1090
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1091 if (isDataseg())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1092 id = mangle();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1094 id = ident.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1096 s = symbol_calloc(toStringz(id));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1097
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1098 if (storage_class & (STC.STCout | STC.STCref))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1099 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 if (global.params.symdebug && storage_class & STC.STCparameter)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1102 t = type_alloc(TYM.TYnptr); // should be TYref, but problems in back end
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 t.Tnext = type.toCtype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 t.Tnext.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1106 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107 t = type_fake(TYM.TYnptr);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109 else if (storage_class & STC.STClazy)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 t = type_fake(TYM.TYdelegate); // Tdelegate as C type
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 else if (isParameter())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1112 t = type.toCParamtype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114 t = type.toCtype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 t.Tcount++;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1117
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 if (isDataseg())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1120 if (isThreadlocal())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1122 /* Thread local storage
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1124 TYPE* ts = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 ts.Tcount++; // make sure a different t is allocated
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126 type_setty(&t, t.Tty | mTY.mTYthread);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127 ts.Tcount--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1129 if (global.params.vtls)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1131 string p = loc.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1132 writef("%s: %s is thread local\n", p ? p : "", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1133 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1134 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1135
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1136 s.Sclass = SC.SCextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1137 s.Sfl = FL.FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1138 slist_add(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1139 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1140 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 s.Sclass = SC.SCauto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1143 s.Sfl = FL.FLauto;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1144
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1145 if (nestedrefs.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1146 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1147 /* Symbol is accessed by a nested function. Make sure
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1148 * it is not put in a register, and that the optimizer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1149 * assumes it is modified across function calls and pointer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1150 * dereferences.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1151 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1152 //printf("\tnested ref, not register\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1153 type_setcv(&t, t.Tty | mTY.mTYvolatile);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1154 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1155 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1156
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1157 mangle_t m = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1158 switch (linkage)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1159 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1160 case LINK.LINKwindows:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1161 m = mTYman.mTYman_std;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1162 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1163
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1164 case LINK.LINKpascal:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1165 m = mTYman.mTYman_pas;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1166 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1167
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1168 case LINK.LINKc:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1169 m = mTYman.mTYman_c;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1170 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1171
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1172 case LINK.LINKd:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1173 m = mTYman.mTYman_d;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1174 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1175
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1176 case LINK.LINKcpp:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1177 m = mTYman.mTYman_cpp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1178 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1179
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1180 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1181 writef("linkage = %d\n", linkage);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1182 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1183 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1184 type_setmangle(&t, m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1185 s.Stype = t;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1186
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1187 csym = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1188 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1189 return csym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1190 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1191
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1192 override void toObjFile(int multiobj) // compile to .obj file
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1193 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1194 Symbol* s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1195 uint sz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1196 Dsymbol parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1197
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1198 //printf("VarDeclaration.toObjFile(%p '%s' type=%s) protection %d\n", this, toChars(), type.toChars(), protection);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1199 //printf("\talign = %d\n", type.alignsize());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1200
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1201 if (aliassym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1202 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1203 toAlias().toObjFile(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1204 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1205 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1206
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1207 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1208 // Do not store variables we cannot take the address of
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1209 if (!canTakeAddressOf())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1210 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1211 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1212 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1213 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1214
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1215 if (isDataseg() && !(storage_class & STC.STCextern))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1216 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1217 s = toSymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1218 sz = cast(uint)type.size();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1219
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1220 parent = this.toParent();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1221 /// version (DMDV1) { /* private statics should still get a global symbol, in case
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1222 /// * another module inlines a function that references it.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1223 /// */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1224 /// if (/*protection == PROT.PROTprivate ||*/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1225 /// !parent || parent.ident == null || parent.isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1226 /// {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1227 /// s.Sclass = SC.SCstatic;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1228 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1229 /// else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1230 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1231 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1232 if (storage_class & STC.STCcomdat)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1233 s.Sclass = SC.SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1234 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1235 s.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1236
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1237 do
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1238 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1239 /* Global template data members need to be in comdat's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1240 * in case multiple .obj files instantiate the same
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1241 * template with the same types.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1242 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1243 if (parent.isTemplateInstance() && !parent.isTemplateMixin())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1244 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1245 version (DMDV1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1246 /* These symbol constants have already been copied,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1247 * so no reason to output them.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1248 * Note that currently there is no way to take
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1249 * the address of such a const.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1250 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1251 if (isConst() && type.toBasetype().ty != TY.Tsarray && init && init.isExpInitializer())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1252 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1253 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1254 s.Sclass = SC.SCcomdat;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1255 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1256 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1257 parent = parent.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1258 } while (parent);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1259 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1260
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1261 s.Sfl = FL.FLdata;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1262
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1263 if (init)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1265 s.Sdt = init.toDt();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1266
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1267 // Look for static array that is block initialized
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1268 Type tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1269 ExpInitializer ie = init.isExpInitializer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1270
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1271 tb = type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1272 if (tb.ty == TY.Tsarray && ie
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1273 && !tb.nextOf().equals(ie.exp.type.toBasetype().nextOf())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1274 && ie.exp.implicitConvTo(tb.nextOf()))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1275 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1276 int dim = cast(int)(cast(TypeSArray)tb).dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1277
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1278 // Duplicate Sdt 'dim-1' times, as we already have the first one
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1279 while (--dim > 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1280 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1281 ie.exp.toDt(&s.Sdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1282 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1283 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1284 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1285 else if (storage_class & STC.STCextern)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1286 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1287 s.Sclass = SC.SCextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1288 s.Sfl = FL.FLextern;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1289 s.Sdt = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1290 // BUG: if isExport(), shouldn't we make it dllimport?
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1291 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1292 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1293 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1294 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1295 type.toDt(&s.Sdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1296 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1297 dt_optimize(s.Sdt);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1298
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1299 // See if we can convert a comdat to a comdef,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1300 // which saves on exe file space.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1301 if (s.Sclass == SC.SCcomdat &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1302 s.Sdt &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1303 s.Sdt.dt == DT.DT_azeros &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1304 s.Sdt.DTnext is null &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1305 !isThreadlocal())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1306 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1307 s.Sclass = SC.SCglobal;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1308 s.Sdt.dt = DT.DT_common;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1309 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1310
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1311 version (ELFOBJ_OR_MACHOBJ) { // Burton
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1312 if (s.Sdt && s.Sdt.dt == DT.DT_azeros && s.Sdt.DTnext is null)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1313 s.Sseg = Segment.UDATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1314 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1315 s.Sseg = Segment.DATA;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1316 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1317 if (sz)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1318 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1319 outdata(s);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1320 if (isExport())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1321 obj_export(s, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1322 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1323 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1324 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1325
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1326 override int cvMember(ubyte* p)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1327 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1328 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1329 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1330
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1331 // Eliminate need for dynamic_cast
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 68
diff changeset
1332 override VarDeclaration isVarDeclaration() { return this; }
16
5c9b78899f5d Implemented methods for Tuples, fixed some linking issues.
Robert Clipsham <robert@octarineparrot.com>
parents: 0
diff changeset
1333 }
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
1334
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 77
diff changeset
1335 alias Vector!VarDeclaration VarDeclarations;