annotate dmd/scope.c @ 323:0d52412d5b1a trunk

[svn r344] Fixed some very minor issues with the usage listing when calling llvmdc with no arguments. Changed the way moduleinfo is registered to use the same approach as DMD, this eliminates the need for correct linking order and should make the way for using a natively compiled runtime library. This should speed up linking tremendously and should now be possible. Fixed the llvm.used array to only be emitted if really necessary.
author lindquist
date Wed, 09 Jul 2008 23:43:51 +0200
parents a58d8f4b84df
children d4e95db0e62b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
2 // Copyright (c) 1999-2005 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
10 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
11 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
12
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
13 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
14
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
15 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
16 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
17 #include "identifier.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
18 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
19 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
20 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
21 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
22 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
23 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
24 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
25
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
26 Scope *Scope::freelist = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
27
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
28 void *Scope::operator new(size_t size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
29 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
30 if (freelist)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
31 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
32 Scope *s = freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
33 freelist = s->enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
34 //printf("freelist %p\n", s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
35 assert(s->flags & SCOPEfree);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
36 s->flags &= ~SCOPEfree;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
37 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
38 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
40 void *p = ::operator new(size);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
41 //printf("new %p\n", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
42 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
43 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
44
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
45 Scope::Scope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
46 { // Create root scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
47
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
48 //printf("Scope::Scope() %p\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
49 this->module = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
50 this->scopesym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
51 this->sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
52 this->enclosing = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
53 this->parent = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
54 this->sw = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
55 this->tf = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
56 this->tfOfTry = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
57 this->sbreak = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
58 this->scontinue = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
59 this->fes = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
60 this->structalign = global.structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
61 this->func = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
62 this->slabel = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
63 this->linkage = LINKd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
64 this->protection = PROTpublic;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
65 this->explicitProtection = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
66 this->stc = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
67 this->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
68 this->inunion = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
69 this->incontract = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
70 this->nofree = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
71 this->noctor = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
72 this->noaccesscheck = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
73 this->intypeof = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
74 this->parameterSpecialization = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
75 this->callSuper = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
76 this->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
77 this->anonAgg = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
78 this->lastdc = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
79 this->lastoffset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
80 this->docbuf = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
81 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
82
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
83 Scope::Scope(Scope *enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
84 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
85 //printf("Scope::Scope(enclosing = %p) %p\n", enclosing, this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
86 assert(!(enclosing->flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
87 this->module = enclosing->module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
88 this->func = enclosing->func;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
89 this->parent = enclosing->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
90 this->scopesym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
91 this->sd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
92 this->sw = enclosing->sw;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
93 this->tf = enclosing->tf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
94 this->tfOfTry = enclosing->tfOfTry;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
95 this->sbreak = enclosing->sbreak;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
96 this->scontinue = enclosing->scontinue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
97 this->fes = enclosing->fes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
98 this->structalign = enclosing->structalign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
99 this->enclosing = enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
100 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
101 if (enclosing->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
102 assert(!(enclosing->enclosing->flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
103 if (this == enclosing->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
104 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
105 printf("this = %p, enclosing = %p, enclosing->enclosing = %p\n", this, enclosing, enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
106 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
107 assert(this != enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
108 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
109 this->slabel = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
110 this->linkage = enclosing->linkage;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
111 this->protection = enclosing->protection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
112 this->explicitProtection = enclosing->explicitProtection;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
113 this->stc = enclosing->stc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
114 this->offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
115 this->inunion = enclosing->inunion;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
116 this->incontract = enclosing->incontract;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
117 this->nofree = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
118 this->noctor = enclosing->noctor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
119 this->noaccesscheck = enclosing->noaccesscheck;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
120 this->intypeof = enclosing->intypeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
121 this->parameterSpecialization = enclosing->parameterSpecialization;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
122 this->callSuper = enclosing->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
123 this->flags = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
124 this->anonAgg = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
125 this->lastdc = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
126 this->lastoffset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
127 this->docbuf = enclosing->docbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
128 assert(this != enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
129 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
131 Scope *Scope::createGlobal(Module *module)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
133 Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
134
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
135 sc = new Scope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
136 sc->module = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
137 sc->scopesym = new ScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
138 sc->scopesym->symtab = new DsymbolTable();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
140 // Add top level package as member of this global scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
141 Dsymbol *m = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
142 while (m->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
143 m = m->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
144 m->addMember(NULL, sc->scopesym, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
145 m->parent = NULL; // got changed by addMember()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
146
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
147 // Create the module scope underneath the global scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
148 sc = sc->push(module);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
149 sc->parent = module;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
150 return sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
151 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
153 Scope *Scope::push()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
154 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
155 //printf("Scope::push()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
156 Scope *s = new Scope(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
157 assert(this != s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
158 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
159 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
161 Scope *Scope::push(ScopeDsymbol *ss)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
162 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
163 //printf("Scope::push(%s)\n", ss->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
164 Scope *s = push();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
165 s->scopesym = ss;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
166 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
167 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
168
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
169 Scope *Scope::pop()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
171 //printf("Scope::pop() %p nofree = %d\n", this, nofree);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
172 Scope *enc = enclosing;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
174 if (enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
175 enclosing->callSuper |= callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
177 if (!nofree)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
178 { enclosing = freelist;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
179 freelist = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
180 flags |= SCOPEfree;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
181 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
183 return enc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
184 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
186 void Scope::mergeCallSuper(Loc loc, unsigned cs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
187 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
188 // This does a primitive flow analysis to support the restrictions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
189 // regarding when and how constructors can appear.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
190 // It merges the results of two paths.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
191 // The two paths are callSuper and cs; the result is merged into callSuper.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
193 if (cs != callSuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
194 { int a;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
195 int b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
196
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
197 callSuper |= cs & (CSXany_ctor | CSXlabel);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
198 if (cs & CSXreturn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
200 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
201 else if (callSuper & CSXreturn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
202 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
203 callSuper = cs | (callSuper & (CSXany_ctor | CSXlabel));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
204 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
205 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
206 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
207 a = (cs & (CSXthis_ctor | CSXsuper_ctor)) != 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
208 b = (callSuper & (CSXthis_ctor | CSXsuper_ctor)) != 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
209 if (a != b)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
210 error(loc, "one path skips constructor");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
211 callSuper |= cs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
212 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
213 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
214 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
216 Dsymbol *Scope::search(Loc loc, Identifier *ident, Dsymbol **pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
217 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
218 Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
219
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
220 //printf("Scope::search(%p, '%s')\n", this, ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
221 if (ident == Id::empty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
222 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
223 // Look for module scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
224 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
226 assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
227 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
228 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
229 s = sc->scopesym->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
230 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
231 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
232 //printf("\tfound %s.%s\n", s->parent ? s->parent->toChars() : "", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
233 if (pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
234 *pscopesym = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
235 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
236 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
237 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
238 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
239 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
240 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
241
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
242 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
243 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
244 assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
245 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
246 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
247 //printf("\tlooking in scopesym '%s', kind = '%s'\n", sc->scopesym->toChars(), sc->scopesym->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
248 s = sc->scopesym->search(loc, ident, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
249 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
250 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
251 if ((global.params.warnings ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
252 global.params.Dversion > 1) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
253 ident == Id::length &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
254 sc->scopesym->isArrayScopeSymbol() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
255 sc->enclosing &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
256 sc->enclosing->search(loc, ident, NULL))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
257 {
215
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 159
diff changeset
258 // WTF ?
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
259 if (global.params.warnings)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
260 fprintf(stdmsg, "warning - ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
261 error(s->loc, "array 'length' hides other 'length' name in outer scope");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
262 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
263
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
264 //printf("\tfound %s.%s, kind = '%s'\n", s->parent ? s->parent->toChars() : "", s->toChars(), s->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
265 if (pscopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
266 *pscopesym = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
267 return s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
268 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
269 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
270 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
271
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
272 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
275 Dsymbol *Scope::insert(Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
276 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
277
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
278 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
279 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
280 //printf("\tsc = %p\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
281 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
282 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
283 //printf("\t\tsc->scopesym = %p\n", sc->scopesym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
284 if (!sc->scopesym->symtab)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
285 sc->scopesym->symtab = new DsymbolTable();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
286 return sc->scopesym->symtab->insert(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
287 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
288 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
289 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
290 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
291 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
292
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
293 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
294 * Search enclosing scopes for ClassDeclaration.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
295 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
296
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
297 ClassDeclaration *Scope::getClassScope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
298 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
300 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
301 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
302 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
303
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
304 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
305 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
306 cd = sc->scopesym->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
307 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
308 return cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
309 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
310 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
311 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
314 /********************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
315 * Search enclosing scopes for ClassDeclaration.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
316 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
317
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
318 AggregateDeclaration *Scope::getStructClassScope()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
319 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
320
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
321 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
322 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
323 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
325 if (sc->scopesym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
326 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
327 ad = sc->scopesym->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
328 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
329 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
330 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
331 { ad = sc->scopesym->isStructDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
332 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
333 return ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
334 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
335 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
337 return NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
339
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
340 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
341 * For TemplateDeclarations, we need to remember the Scope
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
342 * where it was declared. So mark the Scope as not
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
343 * to be free'd.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
344 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
345
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
346 void Scope::setNoFree()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
347 { Scope *sc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
348 //int i = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
350 //printf("Scope::setNoFree(this = %p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
351 for (sc = this; sc; sc = sc->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
352 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
353 //printf("\tsc = %p\n", sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
354 sc->nofree = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
355
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
356 assert(!(flags & SCOPEfree));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
357 //assert(sc != sc->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
358 //assert(!sc->enclosing || sc != sc->enclosing->enclosing);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
359 //if (++i == 10)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
360 //assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 145
diff changeset
362 }