annotate dmd/struct.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 44b145be2ef5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
2 // Compiler implementation of the D programming language
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
11 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
12 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
13
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
14 #include "root.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
15 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
16 #include "scope.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
17 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
18 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
19 #include "module.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
20 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
21 #include "statement.h"
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1628
diff changeset
22 #include "template.h"
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
23
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
24 /********************************* AggregateDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
25
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
26 AggregateDeclaration::AggregateDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
27 : ScopeDsymbol(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
28 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
29 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
30
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
31 storage_class = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
32 protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
33 type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
34 handle = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
35 structsize = 0; // size of struct
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
36 alignsize = 0; // size of struct for alignment purposes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
37 structalign = 0; // struct member alignment in effect
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
38 hasUnions = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
39 sizeok = 0; // size not determined yet
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
40 isdeprecated = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
41 inv = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
42 aggNew = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
43 aggDelete = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
44
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
45 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
46 stag = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
47 sinit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
48 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
49 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
50 dtor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
51
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
52 ctor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
53 defaultCtor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
54 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
55
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
56 #if IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
57 availableExternally = true; // assume this unless proven otherwise
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
58 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
59 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
60
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
61 enum PROT AggregateDeclaration::prot()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
62 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
63 return protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
64 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
65
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
66 void AggregateDeclaration::semantic2(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
67 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
68 //printf("AggregateDeclaration::semantic2(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
69 if (scope && members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
70 { error("has forward references");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
71 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
72 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
73 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
74 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
75 sc = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
76 for (size_t i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
77 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
78 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
79 s->semantic2(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
80 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
81 sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
82 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
83 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
84
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
85 void AggregateDeclaration::semantic3(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
86 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
87
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
88 // LDC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
89 if (!global.params.useAvailableExternally)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
90 availableExternally = false;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
91
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
92 //printf("AggregateDeclaration::semantic3(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
93 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
94 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
95 sc = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
96 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
97 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
98 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
99 s->semantic3(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
100 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
101 sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
102 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
103 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
104
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
105 void AggregateDeclaration::inlineScan()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
106 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
107
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
108 //printf("AggregateDeclaration::inlineScan(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
109 if (members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
110 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
111 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
112 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
113 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
114 //printf("inline scan aggregate symbol '%s'\n", s->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
115 s->inlineScan();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
116 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
117 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
118 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
119
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
120 unsigned AggregateDeclaration::size(Loc loc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
121 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
122 //printf("AggregateDeclaration::size() = %d\n", structsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
123 if (!members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
124 error(loc, "unknown size");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
125 if (sizeok != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
126 { error(loc, "no size yet for forward reference");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
127 //*(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
128 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
129 return structsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
130 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
131
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
132 Type *AggregateDeclaration::getType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
133 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
134 return type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
135 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
136
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
137 int AggregateDeclaration::isDeprecated()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
138 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
139 return isdeprecated;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
140 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
141
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
142 /****************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
143 * Do byte or word alignment as necessary.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
144 * Align sizes of 0, as we may not know array sizes yet.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
145 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
146
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
147 void AggregateDeclaration::alignmember(
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
148 unsigned salign, // struct alignment that is in effect
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
149 unsigned size, // alignment requirement of field
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
150 unsigned *poffset)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
151 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
152 //printf("salign = %d, size = %d, offset = %d\n",salign,size,offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
153 if (salign > 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
154 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
155 assert(size != 3);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
156 int sa = size;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
157 if (sa == 0 || salign < sa)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
158 sa = salign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
159 *poffset = (*poffset + sa - 1) & ~(sa - 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
160 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
161 //printf("result = %d\n",offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
162 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
163
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
164
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
165 void AggregateDeclaration::addField(Scope *sc, VarDeclaration *v)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
166 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
167 unsigned memsize; // size of member
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
168 unsigned memalignsize; // size of member for alignment purposes
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
169 unsigned xalign; // alignment boundaries
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
170
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
171 //printf("AggregateDeclaration::addField('%s') %s\n", v->toChars(), toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
172
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
173 // Check for forward referenced types which will fail the size() call
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
174 Type *t = v->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
175 if (t->ty == Tstruct /*&& isStructDeclaration()*/)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
176 { TypeStruct *ts = (TypeStruct *)t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
177 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
178 if (ts->sym == this)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
179 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
180 error("cannot have field %s with same struct type", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
181 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
182 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
183
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
184 if (ts->sym->sizeok != 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
185 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
186 sizeok = 2; // cannot finish; flag as forward referenced
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
187 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
188 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
189 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
190 if (t->ty == Tident)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
191 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
192 sizeok = 2; // cannot finish; flag as forward referenced
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
193 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
194 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
195
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
196 memsize = v->type->size(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
197 memalignsize = v->type->alignsize();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
198 xalign = v->type->memalign(sc->structalign);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
199 alignmember(xalign, memalignsize, &sc->offset);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
200 v->offset = sc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
201 sc->offset += memsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
202 if (sc->offset > structsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
203 structsize = sc->offset;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
204 if (sc->structalign < memalignsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
205 memalignsize = sc->structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
206 if (alignsize < memalignsize)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
207 alignsize = memalignsize;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
208 //printf("\talignsize = %d\n", alignsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
209
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
210 v->storage_class |= STCfield;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
211 //printf(" addField '%s' to '%s' at offset %d, size = %d\n", v->toChars(), toChars(), v->offset, memsize);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
212 fields.push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
213 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
214
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
215
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
216 /********************************* StructDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
217
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
218 StructDeclaration::StructDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
219 : AggregateDeclaration(loc, id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
220 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
221 zeroInit = 0; // assume false until we do semantic processing
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
222 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
223 hasIdentityAssign = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
224 cpctor = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
225 postblit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
226 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
227
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
228 // For forward references
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
229 type = new TypeStruct(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
230 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
231
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
232 Dsymbol *StructDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
233 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
234 StructDeclaration *sd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
235
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
236 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
237 sd = (StructDeclaration *)s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
238 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
239 sd = new StructDeclaration(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
240 ScopeDsymbol::syntaxCopy(sd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
241 return sd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
242 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
243
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
244 void StructDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
245 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
246 Scope *sc2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
247
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
248 //printf("+StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
249
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
250 //static int count; if (++count == 20) *(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
251
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
252 assert(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
253 if (!members) // if forward reference
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
254 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
255
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
256 if (symtab)
1628
6c36e3f49b28 Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents: 1625
diff changeset
257 { if (sizeok == 1 || !scope)
6c36e3f49b28 Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents: 1625
diff changeset
258 { //printf("already completed\n");
6c36e3f49b28 Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents: 1625
diff changeset
259 scope = NULL;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
260 return; // semantic() already completed
1628
6c36e3f49b28 Merge DMD r324: bugzilla 3663 and 3664 - fwd ref regressions
Leandro Lucarella <llucax@gmail.com>
parents: 1625
diff changeset
261 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
262 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
263 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
264 symtab = new DsymbolTable();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
265
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
266 Scope *scx = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
267 if (scope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
268 { sc = scope;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
269 scx = scope; // save so we don't make redundant copies
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
270 scope = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
271 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
272
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1628
diff changeset
273 unsigned dprogress_save = Module::dprogress;
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1628
diff changeset
274
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
275 parent = sc->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
276 type = type->semantic(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
277 #if STRUCTTHISREF
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
278 handle = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
279 #else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
280 handle = type->pointerTo();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
281 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
282 structalign = sc->structalign;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
283 protection = sc->protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
284 if (sc->stc & STCdeprecated)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
285 isdeprecated = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
286 assert(!isAnonymous());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
287 if (sc->stc & STCabstract)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
288 error("structs, unions cannot be abstract");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
289 #if DMDV2
1619
c61782a76dff Merge DMD r304: refactor invariant => immutable
Leandro Lucarella <llucax@gmail.com>
parents: 1607
diff changeset
290 if (storage_class & STCimmutable)
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
291 type = type->invariantOf();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
292 else if (storage_class & STCconst)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
293 type = type->constOf();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
294 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
295
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
296 if (sizeok == 0) // if not already done the addMember step
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
297 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
298 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
299 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
300 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
301 //printf("adding member '%s' to '%s'\n", s->toChars(), this->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
302 s->addMember(sc, this, 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
303 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
304 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
305
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
306 sizeok = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
307 sc2 = sc->push(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
308 sc2->stc = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
309 sc2->parent = this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
310 if (isUnionDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
311 sc2->inunion = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
312 sc2->protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
313 sc2->explicitProtection = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
314
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
315 int members_dim = members->dim;
1625
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
316
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
317 /* Set scope so if there are forward references, we still might be able to
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
318 * resolve individual members like enums.
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
319 */
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
320 for (int i = 0; i < members_dim; i++)
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
321 { Dsymbol *s = (Dsymbol *)members->data[i];
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
322 /* There are problems doing this in the general case because
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
323 * Scope keeps track of things like 'offset'
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
324 */
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
325 if (s->isEnumDeclaration() || (s->isAggregateDeclaration() && s->ident))
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
326 {
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
327 //printf("setScope %s %s\n", s->kind(), s->toChars());
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
328 s->setScope(sc2);
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
329 }
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
330 }
79f64d5fee9e Merge DMD r319: bugzilla 400 forward reference error...
Leandro Lucarella <llucax@gmail.com>
parents: 1624
diff changeset
331
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
332 for (i = 0; i < members_dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
333 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
334 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
335 s->semantic(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
336 if (isUnionDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
337 sc2->offset = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
338 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
339 if (sizeok == 2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
340 { //printf("forward reference\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
341 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
342 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
343 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
344 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
346 /* The TypeInfo_Struct is expecting an opEquals and opCmp with
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
347 * a parameter that is a pointer to the struct. But if there
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
348 * isn't one, but is an opEquals or opCmp with a value, write
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
349 * another that is a shell around the value:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
350 * int opCmp(struct *p) { return opCmp(*p); }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
351 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
352
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
353 TypeFunction *tfeqptr;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
354 {
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
355 Parameters *arguments = new Parameters;
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
356 Parameter *arg = new Parameter(STCin, handle, Id::p, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
357
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
358 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
359 tfeqptr = new TypeFunction(arguments, Type::tint32, 0, LINKd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
360 tfeqptr = (TypeFunction *)tfeqptr->semantic(0, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
361 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
362
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
363 TypeFunction *tfeq;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
364 {
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
365 Parameters *arguments = new Parameters;
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
366 Parameter *arg = new Parameter(STCin, type, NULL, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
367
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
368 arguments->push(arg);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
369 tfeq = new TypeFunction(arguments, Type::tint32, 0, LINKd);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
370 tfeq = (TypeFunction *)tfeq->semantic(0, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
371 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
372
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
373 Identifier *id = Id::eq;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
374 for (int i = 0; i < 2; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
375 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
376 Dsymbol *s = search_function(this, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
377 FuncDeclaration *fdx = s ? s->isFuncDeclaration() : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
378 if (fdx)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
379 { FuncDeclaration *fd = fdx->overloadExactMatch(tfeqptr, getModule());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
380 if (!fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
381 { fd = fdx->overloadExactMatch(tfeq, getModule());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
382 if (fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
383 { // Create the thunk, fdptr
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
384 FuncDeclaration *fdptr = new FuncDeclaration(loc, loc, fdx->ident, STCundefined, tfeqptr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
385 Expression *e = new IdentifierExp(loc, Id::p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
386 e = new PtrExp(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
387 Expressions *args = new Expressions();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
388 args->push(e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
389 e = new IdentifierExp(loc, id);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
390 e = new CallExp(loc, e, args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
391 fdptr->fbody = new ReturnStatement(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
392 ScopeDsymbol *s = fdx->parent->isScopeDsymbol();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
393 assert(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
394 s->members->push(fdptr);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
395 fdptr->addMember(sc, s, 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
396 fdptr->semantic(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
397 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
398 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
399 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
400
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
401 id = Id::cmp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
402 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
403 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
404 dtor = buildDtor(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
405 postblit = buildPostBlit(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
406 cpctor = buildCpCtor(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
407 buildOpAssign(sc2);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
408 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
409
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
410 sc2->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
411
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
412 if (sizeok == 2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
413 { // semantic() failed because of forward references.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
414 // Unwind what we did, and defer it for later
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
415 fields.setDim(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
416 structsize = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
417 alignsize = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
418 structalign = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
419
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
420 scope = scx ? scx : new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
421 scope->setNoFree();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
422 scope->module->addDeferredSemantic(this);
1630
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1628
diff changeset
423
44b145be2ef5 Merge dmd 1.056.
Robert Clipsham <robert@octarineparrot.com>
parents: 1628
diff changeset
424 Module::dprogress = dprogress_save;
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
425 //printf("\tdeferring %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
426 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
427 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
428
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
429 // 0 sized struct's are set to 1 byte
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
430 if (structsize == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
431 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
432 structsize = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
433 alignsize = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
434 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
435
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
436 // Round struct size up to next alignsize boundary.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
437 // This will ensure that arrays of structs will get their internals
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
438 // aligned properly.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
439 structsize = (structsize + alignsize - 1) & ~(alignsize - 1);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
440
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
441 sizeok = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
442 Module::dprogress++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
443
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
444 //printf("-StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
445
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
446 // Determine if struct is all zeros or not
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
447 zeroInit = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
448 for (i = 0; i < fields.dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
449 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
450 Dsymbol *s = (Dsymbol *)fields.data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
451 VarDeclaration *vd = s->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
452 if (vd && !vd->isDataseg())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
453 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
454 if (vd->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
455 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
456 // Should examine init to see if it is really all 0's
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
457 zeroInit = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
458 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
459 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
460 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
461 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
462 if (!vd->type->isZeroInit(loc))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
463 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
464 zeroInit = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
465 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
466 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
467 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
468 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
469 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
470
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
471 /* Look for special member functions.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
472 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
473 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
474 ctor = (CtorDeclaration *)search(0, Id::ctor, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
475 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
476 inv = (InvariantDeclaration *)search(0, Id::classInvariant, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
477 aggNew = (NewDeclaration *)search(0, Id::classNew, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
478 aggDelete = (DeleteDeclaration *)search(0, Id::classDelete, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
479
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
480 if (sc->func)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
481 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
482 semantic2(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
483 semantic3(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
484 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
485 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
486
1624
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
487 Dsymbol *StructDeclaration::search(Loc loc, Identifier *ident, int flags)
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
488 {
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
489 //printf("%s.StructDeclaration::search('%s')\n", toChars(), ident->toChars());
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
490
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
491 if (scope)
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
492 semantic(scope);
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
493
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
494 if (!members || !symtab)
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
495 {
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
496 error("is forward referenced when looking for '%s'", ident->toChars());
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
497 return NULL;
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
498 }
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
499
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
500 return ScopeDsymbol::search(loc, ident, flags);
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
501 }
ae8a94d87ca9 Merge DMD r318: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
502
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
503 void StructDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
504 { int i;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
505
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
506 buf->printf("%s ", kind());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
507 if (!isAnonymous())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
508 buf->writestring(toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
509 if (!members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
510 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
511 buf->writeByte(';');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
512 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
513 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
514 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
515 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
516 buf->writeByte('{');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
517 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
518 for (i = 0; i < members->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
519 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
520 Dsymbol *s = (Dsymbol *)members->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
521
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
522 buf->writestring(" ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
523 s->toCBuffer(buf, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
524 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
525 buf->writeByte('}');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
526 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
527 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
528
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
529
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
530 const char *StructDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
531 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
532 return "struct";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
533 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
534
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
535 /********************************* UnionDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
536
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
537 UnionDeclaration::UnionDeclaration(Loc loc, Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
538 : StructDeclaration(loc, id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
539 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
540 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
541
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
542 Dsymbol *UnionDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
543 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
544 UnionDeclaration *ud;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
545
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
546 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
547 ud = (UnionDeclaration *)s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
548 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
549 ud = new UnionDeclaration(loc, ident);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
550 StructDeclaration::syntaxCopy(ud);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
551 return ud;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
552 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
553
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
554
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
555 const char *UnionDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
556 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
557 return "union";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
558 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
559
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1482
diff changeset
560