Mercurial > projects > ldc
annotate dmd2/func.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 | e4f7b5d9c68a |
children |
rev | line source |
---|---|
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1 // Compiler implementation of the D programming language |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2 // Copyright (c) 1999-2009 by Digital Mars |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3 // All Rights Reserved |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
4 // written by Walter Bright |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
5 // http://www.digitalmars.com |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
6 // License for redistribution is by either the Artistic License |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
7 // in artistic.txt, or the GNU General Public License in gnu.txt. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
8 // See the included readme.txt for details. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
9 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
10 #include <stdio.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
11 #include <assert.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
12 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
13 #include "mars.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
14 #include "init.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
15 #include "declaration.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
16 #include "attrib.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
17 #include "expression.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
18 #include "scope.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
19 #include "mtype.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
20 #include "aggregate.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
21 #include "identifier.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
22 #include "id.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
23 #include "module.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
24 #include "statement.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
25 #include "template.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
26 #include "hdrgen.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
27 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
28 #ifdef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
29 #include "d-dmd-gcc.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
30 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
31 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
32 /********************************* FuncDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
33 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
34 FuncDeclaration::FuncDeclaration(Loc loc, Loc endloc, Identifier *id, enum STC storage_class, Type *type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
35 : Declaration(id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
36 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
37 //printf("FuncDeclaration(id = '%s', type = %p)\n", id->toChars(), type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
38 //printf("storage_class = x%x\n", storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
39 this->storage_class = storage_class; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
40 this->type = type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
41 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
42 this->endloc = endloc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
43 fthrows = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
44 frequire = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
45 outId = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
46 vresult = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
47 returnLabel = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
48 fensure = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
49 fbody = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
50 localsymtab = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
51 vthis = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
52 v_arguments = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
53 #if IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
54 v_argptr = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
55 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
56 parameters = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
57 labtab = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
58 overnext = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
59 vtblIndex = -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
60 hasReturnExp = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
61 naked = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
62 inlineStatus = ILSuninitialized; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
63 inlineNest = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
64 inlineAsm = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
65 cantInterpret = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
66 semanticRun = 0; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
67 #if DMDV1 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
68 nestedFrameRef = 0; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
69 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
70 fes = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
71 introducing = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
72 tintro = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
73 /* The type given for "infer the return type" is a TypeFunction with |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
74 * NULL for the return type. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
75 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
76 inferRetType = (type && type->nextOf() == NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
77 hasReturnExp = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
78 nrvo_can = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
79 nrvo_var = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
80 #if IN_DMD |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
81 shidden = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
82 #endif |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
83 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
84 builtin = BUILTINunknown; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
85 tookAddressOf = 0; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
86 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
87 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
88 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
89 isArrayOp = false; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
90 allowInlining = false; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
91 |
1487
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
92 availableExternally = true; // assume this unless proven otherwise |
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
93 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
94 // function types in ldc don't merge if the context parameter differs |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
95 // so we actually don't care about the function declaration, but only |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
96 // what kind of context parameter it has. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
97 // however, this constructor is usually called from the parser, which |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
98 // unfortunately doesn't provide the information needed to get to the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
99 // aggregate type. So we have to stick with the FuncDeclaration and |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
100 // just be sure we don't actually rely on the symbol it points to, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
101 // but rather just the type of its context parameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
102 // this means some function might have a function type pointing to |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
103 // another function declaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
104 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
105 if (type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
106 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
107 assert(type->ty == Tfunction && "invalid function type"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
108 TypeFunction* tf = (TypeFunction*)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
109 if (tf->funcdecl == NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
110 tf->funcdecl = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
111 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
112 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
113 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
114 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
115 Dsymbol *FuncDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
116 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
117 FuncDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
118 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
119 //printf("FuncDeclaration::syntaxCopy('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
120 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
121 f = (FuncDeclaration *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
122 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
123 f = new FuncDeclaration(loc, endloc, ident, (enum STC) storage_class, type->syntaxCopy()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
124 f->outId = outId; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
125 f->frequire = frequire ? frequire->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
126 f->fensure = fensure ? fensure->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
127 f->fbody = fbody ? fbody->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
128 assert(!fthrows); // deprecated |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
129 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
130 #if IN_LLVM |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
131 f->intrinsicName = intrinsicName; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
132 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
133 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
134 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
135 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
136 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
137 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
138 // Do the semantic analysis on the external interface to the function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
139 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
140 void FuncDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
141 { TypeFunction *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
142 StructDeclaration *sd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
143 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
144 InterfaceDeclaration *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
145 Dsymbol *pd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
146 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
147 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
148 printf("FuncDeclaration::semantic(sc = %p, this = %p, '%s', linkage = %d)\n", sc, this, toPrettyChars(), sc->linkage); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
149 if (isFuncLiteralDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
150 printf("\tFuncLiteralDeclaration()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
151 printf("sc->parent = %s, parent = %s\n", sc->parent->toChars(), parent ? parent->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
152 printf("type: %p, %s\n", type, type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
153 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
154 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
155 if (semanticRun && isFuncLiteralDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
156 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
157 /* Member functions that have return types that are |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
158 * forward references can have semantic() run more than |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
159 * once on them. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
160 * See test\interface2.d, test20 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
161 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
162 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
163 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
164 assert(semanticRun <= 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
165 semanticRun = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
166 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
167 storage_class |= sc->stc & ~STCref; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
168 //printf("function storage_class = x%x\n", storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
169 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
170 if (!originalType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
171 originalType = type; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
172 if (!type->deco) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
173 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
174 /* Apply const and invariant storage class |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
175 * to the function type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
176 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
177 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
178 unsigned stc = storage_class; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
179 if (type->isInvariant()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
180 stc |= STCimmutable; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
181 if (type->isConst()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
182 stc |= STCconst; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
183 if (type->isShared() || storage_class & STCsynchronized) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
184 stc |= STCshared; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
185 switch (stc & STC_TYPECTOR) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
186 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
187 case STCimmutable: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
188 case STCimmutable | STCconst: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
189 case STCimmutable | STCconst | STCshared: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
190 case STCimmutable | STCshared: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
191 // Don't use toInvariant(), as that will do a merge() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
192 type = type->makeInvariant(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
193 type->deco = type->merge()->deco; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
194 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
195 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
196 case STCconst: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
197 type = type->makeConst(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
198 type->deco = type->merge()->deco; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
199 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
200 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
201 case STCshared | STCconst: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
202 type = type->makeSharedConst(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
203 type->deco = type->merge()->deco; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
204 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
205 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
206 case STCshared: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
207 type = type->makeShared(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
208 type->deco = type->merge()->deco; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
209 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
210 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
211 case 0: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
212 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
213 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
214 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
215 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
216 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
217 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
218 //type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
219 if (type->ty != Tfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
220 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
221 error("%s must be a function", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
222 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
223 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
224 f = (TypeFunction *)(type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
225 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
226 size_t nparams = Argument::dim(f->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
227 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
228 linkage = sc->linkage; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
229 // if (!parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
230 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
231 //parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
232 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
233 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
234 protection = sc->protection; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
235 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
236 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
237 if (storage_class & STCscope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
238 error("functions cannot be scope"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
239 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
240 if (isAbstract() && !isVirtual()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
241 error("non-virtual functions cannot be abstract"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
242 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
243 if ((f->isConst() || f->isInvariant()) && !isThis()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
244 error("without 'this' cannot be const/immutable"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
245 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
246 if (isAbstract() && isFinal()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
247 error("cannot be both final and abstract"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
248 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
249 if (isAbstract() && fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
250 error("abstract functions cannot have bodies"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
251 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
252 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
253 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
254 if (isStaticConstructor() || isStaticDestructor()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
255 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
256 if (!isStatic() || type->nextOf()->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
257 error("static constructors / destructors must be static void"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
258 if (f->arguments && f->arguments->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
259 error("static constructors / destructors must have empty parameter list"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
260 // BUG: check for invalid storage classes |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
261 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
262 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
263 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
264 #ifdef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
265 AggregateDeclaration *ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
266 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
267 ad = parent->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
268 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
269 ad->methods.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
270 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
271 sd = parent->isStructDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
272 if (sd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
273 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
274 if (isCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
275 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
276 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
277 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
278 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
279 // Verify no constructors, destructors, etc. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
280 if (isCtorDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
281 //||isDtorDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
282 //|| isInvariantDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
283 //|| isUnitTestDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
284 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
285 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
286 error("special member functions not allowed for %ss", sd->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
287 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
288 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
289 if (!sd->inv) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
290 sd->inv = isInvariantDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
291 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
292 if (!sd->aggNew) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
293 sd->aggNew = isNewDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
294 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
295 if (isDelete()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
296 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
297 if (sd->aggDelete) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
298 error("multiple delete's for struct %s", sd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
299 sd->aggDelete = (DeleteDeclaration *)(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
300 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
301 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
302 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
304 id = parent->isInterfaceDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
305 if (id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
306 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
307 storage_class |= STCabstract; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
308 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
309 if (isCtorDeclaration() || |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
310 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
311 isPostBlitDeclaration() || |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
312 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
313 isDtorDeclaration() || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
314 isInvariantDeclaration() || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
315 isUnitTestDeclaration() || isNewDeclaration() || isDelete()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
316 error("special function not allowed in interface %s", id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
317 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
318 error("function body is not abstract in interface %s", id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
319 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
320 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
321 /* Template member functions aren't virtual: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
322 * interface TestInterface { void tpl(T)(); } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
323 * and so won't work in interfaces |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
324 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
325 if ((pd = toParent()) != NULL && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
326 pd->isTemplateInstance() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
327 (pd = toParent2()) != NULL && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
328 (id = pd->isInterfaceDeclaration()) != NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
329 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
330 error("template member function not allowed in interface %s", id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
331 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
332 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
333 cd = parent->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
334 if (cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
335 { int vi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
336 CtorDeclaration *ctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
337 DtorDeclaration *dtor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
338 InvariantDeclaration *inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
339 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
340 if (isCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
341 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
342 // ctor = (CtorDeclaration *)this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
343 // if (!cd->ctor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
344 // cd->ctor = ctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
345 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
346 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
347 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
348 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
349 dtor = isDtorDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
350 if (dtor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
351 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
352 if (cd->dtor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
353 error("multiple destructors for class %s", cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
354 cd->dtor = dtor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
355 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
356 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
357 inv = isInvariantDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
358 if (inv) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
359 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
360 cd->inv = inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
361 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
362 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
363 if (isNewDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
364 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
365 if (!cd->aggNew) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
366 cd->aggNew = (NewDeclaration *)(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
367 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
368 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
369 if (isDelete()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
370 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
371 if (cd->aggDelete) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
372 error("multiple delete's for class %s", cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
373 cd->aggDelete = (DeleteDeclaration *)(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
374 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
375 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
376 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
377 if (storage_class & STCabstract) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
378 cd->isabstract = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
379 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
380 // if static function, do not put in vtbl[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
381 if (!isVirtual()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
382 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
383 //printf("\tnot virtual\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
384 goto Ldone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
385 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
386 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
387 // Find index of existing function in vtbl[] to override |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
388 vi = findVtblIndex(&cd->vtbl, cd->baseClass ? cd->baseClass->vtbl.dim : 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
389 switch (vi) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
390 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
391 case -1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
392 /* Didn't find one, so |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
393 * This is an 'introducing' function which gets a new |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
394 * slot in the vtbl[]. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
395 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
396 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
397 // Verify this doesn't override previous final function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
398 if (cd->baseClass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
399 { Dsymbol *s = cd->baseClass->search(loc, ident, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
400 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
401 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
402 FuncDeclaration *f = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
403 f = f->overloadExactMatch(type, getModule()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
404 if (f && f->isFinal() && f->prot() != PROTprivate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
405 error("cannot override final function %s", f->toPrettyChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
406 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
407 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
409 if (isFinal()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
410 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
411 if (isOverride()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
412 error("does not override any function"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
413 cd->vtblFinal.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
414 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
415 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
416 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
417 // Append to end of vtbl[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
418 //printf("\tintroducing function\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
419 introducing = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
420 vi = cd->vtbl.dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
421 cd->vtbl.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
422 vtblIndex = vi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
423 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
424 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
425 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
426 case -2: // can't determine because of fwd refs |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
427 cd->sizeok = 2; // can't finish due to forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
428 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
429 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
430 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
431 { FuncDeclaration *fdv = (FuncDeclaration *)cd->vtbl.data[vi]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
432 // This function is covariant with fdv |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
433 if (fdv->isFinal()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
434 error("cannot override final function %s", fdv->toPrettyChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
435 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
436 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
437 if (!isOverride()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
438 warning(loc, "overrides base class function %s, but is not marked with 'override'", fdv->toPrettyChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
439 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
440 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
441 if (fdv->toParent() == parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
442 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
443 // If both are mixins, then error. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
444 // If either is not, the one that is not overrides |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
445 // the other. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
446 if (fdv->parent->isClassDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
447 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
448 if (!this->parent->isClassDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
449 #if !BREAKABI |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
450 && !isDtorDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
451 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
452 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
453 && !isPostBlitDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
454 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
455 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
456 error("multiple overrides of same function"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
457 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
458 cd->vtbl.data[vi] = (void *)this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
459 vtblIndex = vi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
460 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
461 /* This works by whenever this function is called, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
462 * it actually returns tintro, which gets dynamically |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
463 * cast to type. But we know that tintro is a base |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
464 * of type, so we could optimize it by not doing a |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
465 * dynamic cast, but just subtracting the isBaseOf() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
466 * offset if the value is != null. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
467 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
468 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
469 if (fdv->tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
470 tintro = fdv->tintro; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
471 else if (!type->equals(fdv->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
472 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
473 /* Only need to have a tintro if the vptr |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
474 * offsets differ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
475 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
476 int offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
477 if (fdv->type->nextOf()->isBaseOf(type->nextOf(), &offset)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
478 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
479 tintro = fdv->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
480 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
481 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
482 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
483 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
484 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
485 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
486 /* Go through all the interface bases. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
487 * If this function is covariant with any members of those interface |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
488 * functions, set the tintro. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
489 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
490 for (int i = 0; i < cd->interfaces_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
491 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
492 BaseClass *b = cd->interfaces[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
493 vi = findVtblIndex(&b->base->vtbl, b->base->vtbl.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
494 switch (vi) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
495 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
496 case -1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
497 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
498 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
499 case -2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
500 cd->sizeok = 2; // can't finish due to forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
501 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
502 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
503 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
504 { FuncDeclaration *fdv = (FuncDeclaration *)b->base->vtbl.data[vi]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
505 Type *ti = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
506 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
507 if (fdv->tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
508 ti = fdv->tintro; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
509 else if (!type->equals(fdv->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
510 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
511 /* Only need to have a tintro if the vptr |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
512 * offsets differ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
513 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
514 int offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
515 if (fdv->type->nextOf()->isBaseOf(type->nextOf(), &offset)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
516 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
517 ti = fdv->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
518 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
519 if (offset) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
520 ti = fdv->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
521 else if (type->nextOf()->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
522 { ClassDeclaration *cdn = ((TypeClass *)type->nextOf())->sym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
523 if (cdn && cdn->sizeok != 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
524 ti = fdv->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
525 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
526 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
527 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
528 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
529 if (ti) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
530 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
531 if (tintro && !tintro->equals(ti)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
532 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
533 error("incompatible covariant types %s and %s", tintro->toChars(), ti->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
534 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
535 tintro = ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
536 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
537 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
538 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
539 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
540 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
541 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
542 if (introducing && isOverride()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
543 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
544 error("does not override any function"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
545 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
546 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
547 L2: ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
548 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
549 else if (isOverride() && !parent->isTemplateInstance()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
550 error("override only applies to class member functions"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
551 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
552 /* Do not allow template instances to add virtual functions |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
553 * to a class. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
554 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
555 if (isVirtual()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
556 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
557 TemplateInstance *ti = parent->isTemplateInstance(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
558 if (ti) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
559 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
560 // Take care of nested templates |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
561 while (1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
562 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
563 TemplateInstance *ti2 = ti->tempdecl->parent->isTemplateInstance(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
564 if (!ti2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
565 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
566 ti = ti2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
567 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
568 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
569 // If it's a member template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
570 ClassDeclaration *cd = ti->tempdecl->isClassMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
571 if (cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
572 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
573 error("cannot use template to add virtual function to class '%s'", cd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
574 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
575 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
576 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
577 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
578 if (isMain()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
579 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
580 // Check parameters to see if they are either () or (char[][] args) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
581 switch (nparams) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
582 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
583 case 0: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
584 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
585 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
586 case 1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
587 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
588 Argument *arg0 = Argument::getNth(f->parameters, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
589 if (arg0->type->ty != Tarray || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
590 arg0->type->nextOf()->ty != Tarray || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
591 arg0->type->nextOf()->nextOf()->ty != Tchar || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
592 arg0->storageClass & (STCout | STCref | STClazy)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
593 goto Lmainerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
594 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
596 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
597 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
598 goto Lmainerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
599 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
600 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
601 if (f->nextOf()->ty != Tint32 && f->nextOf()->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
602 error("must return int or void, not %s", f->nextOf()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
603 if (f->varargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
604 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
605 Lmainerr: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
606 error("parameters must be main() or main(char[][] args)"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
607 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
608 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
609 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
610 if (ident == Id::assign && (sd || cd)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
611 { // Disallow identity assignment operator. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
612 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
613 // opAssign(...) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
614 if (nparams == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
615 { if (f->varargs == 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
616 goto Lassignerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
617 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
618 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
619 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
620 Argument *arg0 = Argument::getNth(f->parameters, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
621 Type *t0 = arg0->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
622 Type *tb = sd ? sd->type : cd->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
623 if (arg0->type->implicitConvTo(tb) || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
624 (sd && t0->ty == Tpointer && t0->nextOf()->implicitConvTo(tb)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
625 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
626 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
627 if (nparams == 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
628 goto Lassignerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
629 Argument *arg1 = Argument::getNth(f->parameters, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
630 if (arg1->defaultArg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
631 goto Lassignerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
632 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
633 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
634 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
635 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
636 Ldone: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
637 /* Save scope for possible later use (if we need the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
638 * function internals) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
639 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
640 scope = new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
641 scope->setNoFree(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
642 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
643 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
644 Lassignerr: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
645 if (sd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
646 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
647 sd->hasIdentityAssign = 1; // don't need to generate it |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
648 goto Ldone; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
649 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
650 error("identity assignment operator overload is illegal"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
651 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
652 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
653 void FuncDeclaration::semantic2(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
654 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
655 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
656 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
657 // Do the semantic analysis on the internals of the function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
658 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
659 void FuncDeclaration::semantic3(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
660 { TypeFunction *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
661 VarDeclaration *argptr = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
662 VarDeclaration *_arguments = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
663 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
664 if (!parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
665 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
666 if (global.errors) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
667 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
668 //printf("FuncDeclaration::semantic3(%s '%s', sc = %p)\n", kind(), toChars(), sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
669 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
670 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
671 //printf("FuncDeclaration::semantic3('%s.%s', sc = %p, loc = %s)\n", parent->toChars(), toChars(), sc, loc.toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
672 //fflush(stdout); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
673 //printf("storage class = x%x %x\n", sc->stc, storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
674 //{ static int x; if (++x == 2) *(char*)0=0; } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
675 //printf("\tlinkage = %d\n", sc->linkage); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
676 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
677 //printf(" sc->incontract = %d\n", sc->incontract); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
678 if (semanticRun >= 3) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
679 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
680 semanticRun = 3; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
681 |
1487
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
682 // LDC |
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
683 if (!global.params.useAvailableExternally) |
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
684 availableExternally = false; |
f62347c22d81
Apply changes from r1482 to D2 frontend too. Completely untested, but ldc2
Frits van Bommel <fvbommel wxs.nl>
parents:
1468
diff
changeset
|
685 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
686 if (!type || type->ty != Tfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
687 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
688 f = (TypeFunction *)(type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
689 size_t nparams = Argument::dim(f->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
690 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
691 // Check the 'throws' clause |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
692 if (fthrows) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
693 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
694 for (int i = 0; i < fthrows->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
695 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
696 Type *t = (Type *)fthrows->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
697 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
698 t = t->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
699 if (!t->isClassHandle()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
700 error("can only throw classes, not %s", t->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
701 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
702 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
703 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
704 if (fbody || frequire) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
705 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
706 /* Symbol table into which we place parameters and nested functions, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
707 * solely to diagnose name collisions. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
708 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
709 localsymtab = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
710 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
711 // Establish function scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
712 ScopeDsymbol *ss = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
713 ss->parent = sc->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
714 Scope *sc2 = sc->push(ss); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
715 sc2->func = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
716 sc2->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
717 sc2->callSuper = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
718 sc2->sbreak = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
719 sc2->scontinue = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
720 sc2->sw = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
721 sc2->fes = fes; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
722 sc2->linkage = LINKd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
723 sc2->stc &= ~(STCauto | STCscope | STCstatic | STCabstract | STCdeprecated | STC_TYPECTOR | STCfinal | STCtls | STCgshared | STCref); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
724 sc2->protection = PROTpublic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
725 sc2->explicitProtection = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
726 sc2->structalign = 8; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
727 sc2->incontract = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
728 #if !IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
729 sc2->tf = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
730 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
731 sc2->enclosingFinally = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
732 sc2->enclosingScopeExit = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
733 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
734 sc2->noctor = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
735 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
736 // Declare 'this' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
737 AggregateDeclaration *ad = isThis(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
738 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
739 { VarDeclaration *v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
740 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
741 if (isFuncLiteralDeclaration() && isNested()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
742 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
743 error("literals cannot be class members"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
744 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
745 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
746 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
747 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
748 assert(!isNested()); // can't be both member and nested |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
749 assert(ad->handle); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
750 Type *thandle = ad->handle; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
751 #if STRUCTTHISREF |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
752 thandle = thandle->addMod(type->mod); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
753 thandle = thandle->addStorageClass(storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
754 if (isPure()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
755 thandle = thandle->addMod(MODconst); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
756 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
757 if (storage_class & STCconst || type->isConst()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
758 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
759 assert(0); // BUG: shared not handled |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
760 if (thandle->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
761 thandle = thandle->constOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
762 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
763 { assert(thandle->ty == Tpointer); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
764 thandle = thandle->nextOf()->constOf()->pointerTo(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
765 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
766 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
767 else if (storage_class & STCimmutable || type->isInvariant()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
768 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
769 if (thandle->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
770 thandle = thandle->invariantOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
771 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
772 { assert(thandle->ty == Tpointer); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
773 thandle = thandle->nextOf()->invariantOf()->pointerTo(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
774 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
775 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
776 else if (storage_class & STCshared || type->isShared()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
777 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
778 assert(0); // not implemented |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
779 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
780 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
781 v = new ThisDeclaration(loc, thandle); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
782 v->storage_class |= STCparameter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
783 #if STRUCTTHISREF |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
784 if (thandle->ty == Tstruct) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
785 v->storage_class |= STCref; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
786 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
787 v->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
788 if (!sc2->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
789 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
790 v->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
791 vthis = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
792 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
793 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
794 else if (isNested()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
795 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
796 /* The 'this' for a nested function is the link to the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
797 * enclosing function's stack frame. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
798 * Note that nested functions and member functions are disjoint. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
799 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
800 VarDeclaration *v = new ThisDeclaration(loc, Type::tvoid->pointerTo()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
801 v->storage_class |= STCparameter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
802 v->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
803 if (!sc2->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
804 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
805 v->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
806 vthis = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
807 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
808 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
809 // Declare hidden variable _arguments[] and _argptr |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
810 if (f->varargs == 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
811 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
812 #if TARGET_NET |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
813 varArgs(sc2, f, argptr, _arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
814 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
815 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
816 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
817 if (f->linkage == LINKd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
818 { // Declare _arguments[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
819 #if BREAKABI |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
820 v_arguments = new VarDeclaration(0, Type::typeinfotypelist->type, Id::_arguments_typeinfo, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
821 v_arguments->storage_class = STCparameter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
822 v_arguments->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
823 sc2->insert(v_arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
824 v_arguments->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
826 //t = Type::typeinfo->type->constOf()->arrayOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
827 t = Type::typeinfo->type->arrayOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
828 _arguments = new VarDeclaration(0, t, Id::_arguments, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
829 _arguments->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
830 sc2->insert(_arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
831 _arguments->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
832 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
833 t = Type::typeinfo->type->arrayOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
834 v_arguments = new VarDeclaration(0, t, Id::_arguments, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
835 v_arguments->storage_class = STCparameter | STCin; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
836 v_arguments->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
837 sc2->insert(v_arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
838 v_arguments->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
839 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
840 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
841 if (f->linkage == LINKd || (parameters && parameters->dim)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
842 { // Declare _argptr |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
843 #if IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
844 t = d_gcc_builtin_va_list_d_type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
845 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
846 t = Type::tvoid->pointerTo(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
847 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
848 argptr = new VarDeclaration(0, t, Id::_argptr, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
849 argptr->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
850 sc2->insert(argptr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
851 argptr->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
852 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
853 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
854 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
855 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
856 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
857 // LDC make sure argument type is semanticed. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
858 // Turns TypeTuple!(int, int) into two int parameters, for instance. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
859 if (f->parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
860 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
861 for (size_t i = 0; i < Argument::dim(f->parameters); i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
862 { Argument *arg = (Argument *)Argument::getNth(f->parameters, i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
863 Type* nw = arg->type->semantic(0, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
864 if (arg->type != nw) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
865 arg->type = nw; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
866 // Examine this index again. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
867 // This is important if it turned into a tuple. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
868 // In particular, the empty tuple should be handled or the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
869 // next parameter will be skipped. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
870 // FIXME: Maybe we only need to do this for tuples, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
871 // and can add tuple.length after decrement? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
872 i--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
873 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
874 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
875 // update nparams to include expanded tuples |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
876 nparams = Argument::dim(f->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
877 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
878 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
879 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
880 // Propagate storage class from tuple parameters to their element-parameters. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
881 if (f->parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
882 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
883 for (size_t i = 0; i < f->parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
884 { Argument *arg = (Argument *)f->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
885 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
886 //printf("[%d] arg->type->ty = %d %s\n", i, arg->type->ty, arg->type->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
887 if (arg->type->ty == Ttuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
888 { TypeTuple *t = (TypeTuple *)arg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
889 size_t dim = Argument::dim(t->arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
890 for (size_t j = 0; j < dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
891 { Argument *narg = Argument::getNth(t->arguments, j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
892 narg->storageClass = arg->storageClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
893 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
894 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
895 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
896 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
897 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
898 /* Declare all the function parameters as variables |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
899 * and install them in parameters[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
900 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
901 size_t nparams = Argument::dim(f->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
902 if (nparams) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
903 { /* parameters[] has all the tuples removed, as the back end |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
904 * doesn't know about tuples |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
905 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
906 parameters = new Dsymbols(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
907 parameters->reserve(nparams); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
908 for (size_t i = 0; i < nparams; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
909 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
910 Argument *arg = Argument::getNth(f->parameters, i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
911 Identifier *id = arg->ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
912 if (!id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
913 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
914 /* Generate identifier for un-named parameter, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
915 * because we need it later on. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
916 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
917 arg->ident = id = Identifier::generateId("_param_", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
918 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
919 Type *vtype = arg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
920 if (isPure()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
921 vtype = vtype->addMod(MODconst); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
922 VarDeclaration *v = new VarDeclaration(loc, vtype, id, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
923 //printf("declaring parameter %s of type %s\n", v->toChars(), v->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
924 v->storage_class |= STCparameter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
925 if (f->varargs == 2 && i + 1 == nparams) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
926 v->storage_class |= STCvariadic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
927 v->storage_class |= arg->storageClass & (STCin | STCout | STCref | STClazy | STCfinal | STC_TYPECTOR | STCnodtor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
928 v->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
929 if (!sc2->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
930 error("parameter %s.%s is already defined", toChars(), v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
931 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
932 parameters->push(v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
933 localsymtab->insert(v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
934 v->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
935 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
936 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
937 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
938 // Declare the tuple symbols and put them in the symbol table, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
939 // but not in parameters[]. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
940 if (f->parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
941 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
942 for (size_t i = 0; i < f->parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
943 { Argument *arg = (Argument *)f->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
944 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
945 if (!arg->ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
946 continue; // never used, so ignore |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
947 if (arg->type->ty == Ttuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
948 { TypeTuple *t = (TypeTuple *)arg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
949 size_t dim = Argument::dim(t->arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
950 Objects *exps = new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
951 exps->setDim(dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
952 for (size_t j = 0; j < dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
953 { Argument *narg = Argument::getNth(t->arguments, j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
954 assert(narg->ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
955 VarDeclaration *v = sc2->search(0, narg->ident, NULL)->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
956 assert(v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
957 Expression *e = new VarExp(v->loc, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
958 exps->data[j] = (void *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
959 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
960 assert(arg->ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
961 TupleDeclaration *v = new TupleDeclaration(loc, arg->ident, exps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
962 //printf("declaring tuple %s\n", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
963 v->isexp = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
964 if (!sc2->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
965 error("parameter %s.%s is already defined", toChars(), v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
966 localsymtab->insert(v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
967 v->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
968 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
969 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
970 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
971 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
972 /* Do the semantic analysis on the [in] preconditions and |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
973 * [out] postconditions. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
974 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
975 sc2->incontract++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
976 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
977 if (frequire) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
978 { /* frequire is composed of the [in] contracts |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
979 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
980 // BUG: need to error if accessing out parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
981 // BUG: need to treat parameters as const |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
982 // BUG: need to disallow returns and throws |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
983 // BUG: verify that all in and ref parameters are read |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
984 frequire = frequire->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
985 labtab = NULL; // so body can't refer to labels |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
986 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
987 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
988 if (fensure || addPostInvariant()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
989 { /* fensure is composed of the [out] contracts |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
990 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
991 ScopeDsymbol *sym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
992 sym->parent = sc2->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
993 sc2 = sc2->push(sym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
994 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
995 assert(type->nextOf()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
996 if (type->nextOf()->ty == Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
997 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
998 if (outId) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
999 error("void functions have no result"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1000 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1001 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1002 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1003 if (!outId) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1004 outId = Id::result; // provide a default |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1005 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1006 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1007 if (outId) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1008 { // Declare result variable |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1009 VarDeclaration *v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1010 Loc loc = this->loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1011 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1012 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1013 loc = fensure->loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1014 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1015 v = new VarDeclaration(loc, type->nextOf(), outId, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1016 v->noauto = 1; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1017 #if DMDV2 |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1018 if (f->isref) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1019 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1020 v->storage_class |= STCref | STCforeach; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1021 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1022 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1023 sc2->incontract--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1024 v->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1025 sc2->incontract++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1026 if (!sc2->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1027 error("out result %s is already defined", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1028 v->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1029 vresult = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1030 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1031 // vresult gets initialized with the function return value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1032 // in ReturnStatement::semantic() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1033 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1034 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1035 // BUG: need to treat parameters as const |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1036 // BUG: need to disallow returns and throws |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1037 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1038 { fensure = fensure->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1039 labtab = NULL; // so body can't refer to labels |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1040 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1041 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1042 if (!global.params.useOut) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1043 { fensure = NULL; // discard |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1044 vresult = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1045 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1046 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1047 // Postcondition invariant |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1048 if (addPostInvariant()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1049 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1050 Expression *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1051 if (isCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1052 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1053 // Call invariant directly only if it exists |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1054 InvariantDeclaration *inv = ad->inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1055 ClassDeclaration *cd = ad->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1056 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1057 while (!inv && cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1058 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1059 cd = cd->baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1060 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1061 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1062 inv = cd->inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1063 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1064 if (inv) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1065 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1066 e = new DsymbolExp(0, inv); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1067 e = new CallExp(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1068 e = e->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1069 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1070 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1071 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1072 { // Call invariant virtually |
1468
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1073 ThisExp *tv = new ThisExp(0); |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1074 tv->type = vthis->type; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1075 tv->var = vthis; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1076 Expression* v = tv; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1077 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1078 #if STRUCTTHISREF |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1079 if (ad->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1080 v = v->addressOf(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1081 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1082 e = new AssertExp(0, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1083 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1084 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1085 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1086 ExpStatement *s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1087 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1088 fensure = new CompoundStatement(0, s, fensure); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1089 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1090 fensure = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1091 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1092 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1093 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1094 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1095 { returnLabel = new LabelDsymbol(Id::returnLabel); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1096 LabelStatement *ls = new LabelStatement(0, Id::returnLabel, fensure); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1097 ls->isReturnLabel = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1098 returnLabel->statement = ls; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1099 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1100 sc2 = sc2->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1101 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1102 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1103 sc2->incontract--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1104 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1105 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1106 { ClassDeclaration *cd = isClassMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1107 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1108 /* If this is a class constructor |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1109 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1110 if (isCtorDeclaration() && cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1111 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1112 for (int i = 0; i < cd->fields.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1113 { VarDeclaration *v = (VarDeclaration *)cd->fields.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1114 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1115 v->ctorinit = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1116 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1117 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1118 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1119 if (inferRetType || f->retStyle() != RETstack) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1120 nrvo_can = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1121 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1122 fbody = fbody->semantic(sc2); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1123 if (!fbody) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1124 fbody = new CompoundStatement(0, new Statements()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1125 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1126 if (inferRetType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1127 { // If no return type inferred yet, then infer a void |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1128 if (!type->nextOf()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1129 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1130 ((TypeFunction *)type)->next = Type::tvoid; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1131 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1132 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1133 f = (TypeFunction *)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1134 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1135 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1136 if (isStaticCtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1137 { /* It's a static constructor. Ensure that all |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1138 * ctor consts were initialized. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1139 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1140 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1141 Dsymbol *p = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1142 ScopeDsymbol *ad = p->isScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1143 if (!ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1144 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1145 error("static constructor can only be member of struct/class/module, not %s %s", p->kind(), p->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1146 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1147 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1148 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1149 for (int i = 0; i < ad->members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1150 { Dsymbol *s = (Dsymbol *)ad->members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1151 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1152 s->checkCtorConstInit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1153 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1154 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1155 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1156 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1157 if (isCtorDeclaration() && cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1158 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1159 //printf("callSuper = x%x\n", sc2->callSuper); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1160 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1161 // Verify that all the ctorinit fields got initialized |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1162 if (!(sc2->callSuper & CSXthis_ctor)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1163 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1164 for (int i = 0; i < cd->fields.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1165 { VarDeclaration *v = (VarDeclaration *)cd->fields.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1166 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1167 if (v->ctorinit == 0 && v->isCtorinit()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1168 error("missing initializer for final field %s", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1169 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1170 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1171 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1172 if (!(sc2->callSuper & CSXany_ctor) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1173 cd->baseClass && cd->baseClass->ctor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1174 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1175 sc2->callSuper = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1176 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1177 // Insert implicit super() at start of fbody |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1178 Expression *e1 = new SuperExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1179 Expression *e = new CallExp(0, e1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1181 e = e->trySemantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1182 if (!e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1183 error("no match for implicit super() call in constructor"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1184 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1185 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1186 Statement *s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1187 fbody = new CompoundStatement(0, s, fbody); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1188 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1189 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1190 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1191 else if (fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1192 { // For foreach(){} body, append a return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1193 Expression *e = new IntegerExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1194 Statement *s = new ReturnStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1195 fbody = new CompoundStatement(0, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1196 assert(!returnLabel); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1197 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1198 else if (!hasReturnExp && type->nextOf()->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1199 error("expected to return a value of type %s", type->nextOf()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1200 else if (!inlineAsm) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1201 { |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1202 #if DMDV2 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1203 int blockexit = fbody ? fbody->blockExit() : BEfallthru; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1204 if (f->isnothrow && blockexit & BEthrow) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1205 error("'%s' is nothrow yet may throw", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1206 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1207 int offend = blockexit & BEfallthru; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1208 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1209 if (type->nextOf()->ty == Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1210 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1211 if (offend && isMain()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1212 { // Add a return 0; statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1213 Statement *s = new ReturnStatement(0, new IntegerExp(0)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1214 fbody = new CompoundStatement(0, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1215 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1216 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1217 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1218 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1219 if (offend) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1220 { Expression *e; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1221 #if DMDV1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1222 warning(loc, "no return exp; or assert(0); at end of function"); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1223 #else |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
1224 error("no return exp; or assert(0); at end of function"); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1225 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1226 if (global.params.useAssert && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1227 !global.params.useInline) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1228 { /* Add an assert(0, msg); where the missing return |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1229 * should be. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1230 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1231 e = new AssertExp( |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1232 endloc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1233 new IntegerExp(0), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1234 new StringExp(loc, (char *)"missing return expression") |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1235 ); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1236 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1237 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1238 e = new HaltExp(endloc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1239 e = new CommaExp(0, e, type->nextOf()->defaultInit()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1240 e = e->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1241 Statement *s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1242 fbody = new CompoundStatement(0, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1243 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1244 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1245 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1246 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1247 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1248 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1249 Statements *a = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1250 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1251 // Merge in initialization of 'out' parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1252 if (parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1253 { for (size_t i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1254 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1255 VarDeclaration *v = (VarDeclaration *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1256 if (v->storage_class & STCout) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1257 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1258 assert(v->init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1259 ExpInitializer *ie = v->init->isExpInitializer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1260 assert(ie); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1261 a->push(new ExpStatement(0, ie->exp)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1262 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1263 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1264 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1265 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1266 // we'll handle variadics ourselves |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1267 #if !IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1268 if (argptr) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1269 { // Initialize _argptr to point past non-variadic arg |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1270 #if IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1271 // Handled in FuncDeclaration::toObjFile |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1272 v_argptr = argptr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1273 v_argptr->init = new VoidInitializer(loc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1274 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1275 Expression *e1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1276 Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1277 Type *t = argptr->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1278 VarDeclaration *p; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1279 unsigned offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1280 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1281 e1 = new VarExp(0, argptr); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1282 if (parameters && parameters->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1283 p = (VarDeclaration *)parameters->data[parameters->dim - 1]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1284 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1285 p = v_arguments; // last parameter is _arguments[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1286 offset = p->type->size(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1287 offset = (offset + 3) & ~3; // assume stack aligns on 4 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1288 e = new SymOffExp(0, p, offset); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1289 e = new AssignExp(0, e1, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1290 e->type = t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1291 a->push(new ExpStatement(0, e)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1292 #endif // IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1293 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1294 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1295 if (_arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1296 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1297 /* Advance to elements[] member of TypeInfo_Tuple with: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1298 * _arguments = v_arguments.elements; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1299 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1300 Expression *e = new VarExp(0, v_arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1301 e = new DotIdExp(0, e, Id::elements); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1302 Expression *e1 = new VarExp(0, _arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1303 e = new AssignExp(0, e1, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1304 e->op = TOKconstruct; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1305 e = e->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1306 a->push(new ExpStatement(0, e)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1307 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1308 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1309 #endif // !IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1310 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1311 // Merge contracts together with body into one compound statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1312 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1313 #ifdef _DH |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1314 if (frequire && global.params.useIn) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1315 { frequire->incontract = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1316 a->push(frequire); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1317 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1318 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1319 if (frequire && global.params.useIn) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1320 a->push(frequire); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1321 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1322 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1323 // Precondition invariant |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1324 if (addPreInvariant()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1325 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1326 Expression *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1327 Expression *ee = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1328 if (isDtorDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1329 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1330 // Call invariant directly only if it exists |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1331 InvariantDeclaration *inv = ad->inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1332 ClassDeclaration *cd = ad->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1333 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1334 while (!inv && cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1335 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1336 cd = cd->baseClass; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1337 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1338 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1339 inv = cd->inv; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1340 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1341 if (inv) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1342 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1343 e = new DsymbolExp(0, inv); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1344 e = new CallExp(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1345 e = e->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1346 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1347 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1348 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1349 { // Call invariant virtually |
1468
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1350 ThisExp* tv = new ThisExp(0); |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1351 tv->type = vthis->type; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1352 tv->var = vthis; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1353 Expression *v = tv; |
7d1e815b4f76
Change the frontend generated assert(this) or assert(&this) in D2 to set the ThisExp::var field.
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents:
1452
diff
changeset
|
1354 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1355 #if STRUCTTHISREF |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1356 if (ad->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1357 v = v->addressOf(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1358 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1359 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1360 //e = new AssertExp(loc, v, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1361 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1362 // LDC: check for null this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1363 //v = new ThisExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1364 //v->type = vthis->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1365 //v->var = vthis; // Error: Expression has no property var... in D1 typeof(v) == ThisExp |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1366 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1367 //NullExp *nv = new NullExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1368 //nv->type = v->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1369 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1370 //IdentityExp *ie = new IdentityExp(TOKnotidentity, 0, v, nv); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1371 //ie->type = Type::tbool; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1372 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1373 Expression *se = new StringExp(0, (char *)"null this"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1374 se = se->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1375 se->type = Type::tchar->arrayOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1376 //#if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1377 // ee = new AssertExp(loc, ie, se); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1378 //#else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1379 e = new AssertExp(loc, v, se); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1380 //#endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1381 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1382 if (ee) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1383 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1384 ExpStatement *s = new ExpStatement(0, ee); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1385 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1386 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1387 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1388 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1389 ExpStatement *s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1390 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1391 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1392 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1393 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1394 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1395 a->push(fbody); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1396 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1397 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1398 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1399 a->push(returnLabel->statement); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1400 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1401 if (type->nextOf()->ty != Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1402 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1403 // Create: return vresult; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1404 assert(vresult); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1405 Expression *e = new VarExp(0, vresult); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1406 if (tintro) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1407 { e = e->implicitCastTo(sc, tintro->nextOf()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1408 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1409 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1410 ReturnStatement *s = new ReturnStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1411 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1412 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1413 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1414 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1415 fbody = new CompoundStatement(0, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1416 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1417 #if 0 // This seems to have been added in with dmd 2.032, see below |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1418 // wrap body of synchronized functions in a synchronized statement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1419 if (isSynchronized()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1420 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1421 ClassDeclaration *cd = parent->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1422 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1423 error("synchronized function %s must be a member of a class", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1424 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1425 Expression *sync; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1426 if (isStatic()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1427 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1428 // static member functions synchronize on classinfo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1429 sync = cd->type->dotExp(sc2, new TypeExp(loc, cd->type), Id::classinfo); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1430 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1431 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1432 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1433 // non-static member functions synchronize on this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1434 sync = new VarExp(loc, vthis); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1436 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1437 // we do not want to rerun semantics on the whole function, so we |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1438 // manually adjust all labels in the function that currently don't |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1439 // have an enclosingScopeExit to use the new SynchronizedStatement |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1440 SynchronizedStatement* s = new SynchronizedStatement(loc, sync, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1441 s->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1442 s->body = fbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1443 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1444 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1445 LabelMap::iterator it, end = labmap.end(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1446 for (it = labmap.begin(); it != end; ++it) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1447 if (it->second->enclosingScopeExit == NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1448 it->second->enclosingScopeExit = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1449 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1450 a = new Statements; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1451 a->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1452 fbody = new CompoundStatement(0, a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1453 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1454 #endif |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1455 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1456 /* Append destructor calls for parameters as finally blocks. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1457 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1458 if (parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1459 { for (size_t i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1460 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1461 VarDeclaration *v = (VarDeclaration *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1462 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1463 if (v->storage_class & (STCref | STCout)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1464 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1465 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1466 /* Don't do this for static arrays, since static |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1467 * arrays are called by reference. Remove this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1468 * when we change them to call by value. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1469 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1470 if (v->type->toBasetype()->ty == Tsarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1471 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1472 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1473 Expression *e = v->callAutoDtor(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1474 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1475 { Statement *s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1476 s = s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1477 if (fbody->blockExit() == BEfallthru) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1478 fbody = new CompoundStatement(0, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1479 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1480 fbody = new TryFinallyStatement(0, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1481 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1482 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1483 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1484 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1485 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1486 #if 1 |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1487 if (isSynchronized()) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1488 { /* Wrap the entire function body in a synchronized statement |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1489 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1490 ClassDeclaration *cd = parent->isClassDeclaration(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1491 if (cd) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1492 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1493 #if TARGET_WINDOS |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1494 if (/*config.flags2 & CFG2seh &&*/ // always on for WINDOS |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1495 !isStatic() && !fbody->usesEH()) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1496 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1497 /* The back end uses the "jmonitor" hack for syncing; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1498 * no need to do the sync at this level. |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1499 */ |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1500 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1501 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1502 #endif |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1503 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1504 Expression *vsync; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1505 if (isStatic()) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1506 { // The monitor is in the ClassInfo |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1507 vsync = new DotIdExp(loc, new DsymbolExp(loc, cd), Id::classinfo); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1508 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1509 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1510 { // 'this' is the monitor |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1511 vsync = new VarExp(loc, vthis); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1512 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1513 fbody = new PeelStatement(fbody); // don't redo semantic() |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1514 fbody = new SynchronizedStatement(loc, vsync, fbody); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1515 fbody = fbody->semantic(sc2); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1516 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1517 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1518 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1519 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1520 error("synchronized function %s must be a member of a class", toChars()); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1521 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1522 } |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1523 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1524 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1525 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1526 sc2->callSuper = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1527 sc2->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1528 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1529 semanticRun = 4; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1530 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1531 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1532 void FuncDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1533 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1534 //printf("FuncDeclaration::toCBuffer() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1535 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1536 StorageClassDeclaration::stcToCBuffer(buf, storage_class); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1537 type->toCBuffer(buf, ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1538 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1539 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1540 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1541 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1542 void FuncDeclaration::bodyToCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1543 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1544 if (fbody && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1545 (!hgs->hdrgen || hgs->tpltMember || canInline(1,1)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1546 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1547 { buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1548 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1549 // in{} |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1550 if (frequire) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1551 { buf->writestring("in"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1552 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1553 frequire->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1554 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1555 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1556 // out{} |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1557 if (fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1558 { buf->writestring("out"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1559 if (outId) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1560 { buf->writebyte('('); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1561 buf->writestring(outId->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1562 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1563 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1564 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1565 fensure->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1566 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1567 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1568 if (frequire || fensure) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1569 { buf->writestring("body"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1570 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1571 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1572 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1573 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1574 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1575 fbody->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1576 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1577 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1578 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1579 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1580 { buf->writeByte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1581 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1582 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1583 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1584 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1585 /**************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1586 * Determine if 'this' overrides fd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1587 * Return !=0 if it does. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1588 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1589 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1590 int FuncDeclaration::overrides(FuncDeclaration *fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1591 { int result = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1592 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1593 if (fd->ident == ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1594 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1595 int cov = type->covariant(fd->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1596 if (cov) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1597 { ClassDeclaration *cd1 = toParent()->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1598 ClassDeclaration *cd2 = fd->toParent()->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1599 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1600 if (cd1 && cd2 && cd2->isBaseOf(cd1, NULL)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1601 result = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1602 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1603 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1604 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1605 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1606 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1607 /************************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1608 * Find index of function in vtbl[0..dim] that |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1609 * this function overrides. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1610 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1611 * -1 didn't find one |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1612 * -2 can't determine because of forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1613 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1614 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1615 int FuncDeclaration::findVtblIndex(Array *vtbl, int dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1616 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1617 for (int vi = 0; vi < dim; vi++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1618 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1619 FuncDeclaration *fdv = ((Dsymbol *)vtbl->data[vi])->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1620 if (fdv && fdv->ident == ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1621 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1622 int cov = type->covariant(fdv->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1623 //printf("\tbaseclass cov = %d\n", cov); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1624 switch (cov) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1625 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1626 case 0: // types are distinct |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1627 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1628 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1629 case 1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1630 return vi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1631 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1632 case 2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1633 //type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1634 //fdv->type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1635 //printf("%s %s\n", type->deco, fdv->type->deco); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1636 error("of type %s overrides but is not covariant with %s of type %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1637 type->toChars(), fdv->toPrettyChars(), fdv->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1638 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1639 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1640 case 3: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1641 return -2; // forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1642 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1643 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1644 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1645 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1646 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1647 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1648 return -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1649 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1650 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1651 /**************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1652 * Overload this FuncDeclaration with the new one f. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1653 * Return !=0 if successful; i.e. no conflict. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1654 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1655 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1656 int FuncDeclaration::overloadInsert(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1657 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1658 FuncDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1659 AliasDeclaration *a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1660 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1661 //printf("FuncDeclaration::overloadInsert(%s)\n", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1662 a = s->isAliasDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1663 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1664 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1665 if (overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1666 return overnext->overloadInsert(a); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1667 if (!a->aliassym && a->type->ty != Tident && a->type->ty != Tinstance) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1668 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1669 //printf("\ta = '%s'\n", a->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1670 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1671 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1672 overnext = a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1673 //printf("\ttrue: no conflict\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1674 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1675 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1676 f = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1677 if (!f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1678 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1679 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1680 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1681 /* Disable this check because: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1682 * const void foo(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1683 * semantic() isn't run yet on foo(), so the const hasn't been |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1684 * applied yet. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1685 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1686 if (type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1687 { printf("type = %s\n", type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1688 printf("f->type = %s\n", f->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1689 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1690 if (type && f->type && // can be NULL for overloaded constructors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1691 f->type->covariant(type) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1692 f->type->mod == type->mod && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1693 !isFuncAliasDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1694 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1695 //printf("\tfalse: conflict %s\n", kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1696 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1697 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1698 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1699 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1700 if (overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1701 return overnext->overloadInsert(f); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1702 overnext = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1703 //printf("\ttrue: no conflict\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1704 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1705 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1706 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1707 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1708 * Find function in overload list that exactly matches t. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1709 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1710 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1711 /*************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1712 * Visit each overloaded function in turn, and call |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1713 * (*fp)(param, f) on it. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1714 * Exit when no more, or (*fp)(param, f) returns 1. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1715 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1716 * 0 continue |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1717 * 1 done |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1718 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1719 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1720 int overloadApply(Module* from, FuncDeclaration *fstart, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1721 int (*fp)(void *, FuncDeclaration *), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1722 void *param) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1723 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1724 FuncDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1725 Declaration *d; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1726 Declaration *next; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1727 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1728 for (d = fstart; d; d = next) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1729 { FuncAliasDeclaration *fa = d->isFuncAliasDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1730 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1731 if (fa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1732 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1733 if (fa->getModule() == from || fa->importprot != PROTprivate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1734 if (overloadApply(from, fa->funcalias, fp, param)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1735 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1736 next = fa->overnext; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1737 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1738 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1739 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1740 AliasDeclaration *a = d->isAliasDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1741 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1742 if (a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1743 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1744 Dsymbol *s = a->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1745 next = s->isDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1746 if (next == a) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1747 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1748 if (next == fstart) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1749 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1750 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1751 if (a->importprot == PROTprivate && a->getModule() != from) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1752 if (FuncDeclaration* fd = next->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1753 next = fd->overnext; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1754 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1755 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1756 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1757 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1758 f = d->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1759 if (!f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1760 { d->error("is aliased to a function"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1761 break; // BUG: should print error message? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1762 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1763 if ((*fp)(param, f)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1764 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1765 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1766 next = f->overnext; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1767 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1768 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1769 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1770 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1771 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1772 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1773 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1774 * If there are no overloads of function f, return that function, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1775 * otherwise return NULL. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1776 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1777 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1778 static int fpunique(void *param, FuncDeclaration *f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1779 { FuncDeclaration **pf = (FuncDeclaration **)param; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1780 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1781 if (*pf) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1782 { *pf = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1783 return 1; // ambiguous, done |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1784 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1785 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1786 { *pf = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1787 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1788 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1789 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1790 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1791 FuncDeclaration *FuncDeclaration::isUnique() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1792 { FuncDeclaration *result = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1793 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1794 overloadApply(getModule(), this, &fpunique, &result); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1795 return result; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1796 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1797 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1798 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1799 * Find function in overload list that exactly matches t. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1800 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1801 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1802 struct Param1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1803 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1804 Type *t; // type to match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1805 FuncDeclaration *f; // return value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1806 }; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1807 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1808 int fp1(void *param, FuncDeclaration *f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1809 { Param1 *p = (Param1 *)param; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1810 Type *t = p->t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1811 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1812 if (t->equals(f->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1813 { p->f = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1814 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1815 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1816 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1817 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1818 /* Allow covariant matches, if it's just a const conversion |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1819 * of the return type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1820 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1821 if (t->ty == Tfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1822 { TypeFunction *tf = (TypeFunction *)f->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1823 if (tf->covariant(t) == 1 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1824 tf->nextOf()->implicitConvTo(t->nextOf()) >= MATCHconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1825 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1826 p->f = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1827 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1828 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1829 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1830 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1831 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1832 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1833 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1834 FuncDeclaration *FuncDeclaration::overloadExactMatch(Type *t, Module* from) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1835 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1836 Param1 p; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1837 p.t = t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1838 p.f = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1839 overloadApply(from, this, &fp1, &p); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1840 return p.f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1841 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1842 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1843 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1844 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1845 * Decide which function matches the arguments best. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1846 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1847 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1848 struct Param2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1849 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1850 Match *m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1851 Expression *ethis; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1852 Expressions *arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1853 }; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1854 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1855 int fp2(void *param, FuncDeclaration *f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1856 { Param2 *p = (Param2 *)param; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1857 Match *m = p->m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1858 Expressions *arguments = p->arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1859 MATCH match; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1860 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1861 if (f != m->lastf) // skip duplicates |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1862 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1863 m->anyf = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1864 TypeFunction *tf = (TypeFunction *)f->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1865 match = (MATCH) tf->callMatch(f->needThis() ? p->ethis : NULL, arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1866 //printf("match = %d\n", match); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1867 if (match != MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1868 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1869 if (match > m->last) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1870 goto LfIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1871 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1872 if (match < m->last) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1873 goto LlastIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1874 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1875 /* See if one of the matches overrides the other. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1876 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1877 if (m->lastf->overrides(f)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1878 goto LlastIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1879 else if (f->overrides(m->lastf)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1880 goto LfIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1881 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1882 /* Try to disambiguate using template-style partial ordering rules. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1883 * In essence, if f() and g() are ambiguous, if f() can call g(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1884 * but g() cannot call f(), then pick f(). |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1885 * This is because f() is "more specialized." |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1886 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1887 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1888 MATCH c1 = f->leastAsSpecialized(m->lastf); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1889 MATCH c2 = m->lastf->leastAsSpecialized(f); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1890 //printf("c1 = %d, c2 = %d\n", c1, c2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1891 if (c1 > c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1892 goto LfIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1893 if (c1 < c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1894 goto LlastIsBetter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1895 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1896 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1897 Lambiguous: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1898 m->nextf = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1899 m->count++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1900 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1901 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1902 LfIsBetter: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1903 m->last = match; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1904 m->lastf = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1905 m->count = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1906 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1907 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1908 LlastIsBetter: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1909 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1910 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1911 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1912 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1913 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1914 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1915 void overloadResolveX(Match *m, FuncDeclaration *fstart, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1916 Expression *ethis, Expressions *arguments, Module* from) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1917 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1918 Param2 p; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1919 p.m = m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1920 p.ethis = ethis; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1921 p.arguments = arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1922 overloadApply(from, fstart, &fp2, &p); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1923 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1924 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1925 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1926 FuncDeclaration *FuncDeclaration::overloadResolve(Loc loc, Expression *ethis, Expressions *arguments, int flags, Module* from) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1927 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1928 TypeFunction *tf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1929 Match m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1930 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1931 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1932 printf("FuncDeclaration::overloadResolve('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1933 if (arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1934 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1935 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1936 for (i = 0; i < arguments->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1937 { Expression *arg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1938 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1939 arg = (Expression *)arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1940 assert(arg->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1941 printf("\t%s: ", arg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1942 arg->type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1943 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1944 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1945 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1946 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1947 memset(&m, 0, sizeof(m)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1948 m.last = MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1949 overloadResolveX(&m, this, ethis, arguments, from); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1950 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1951 if (m.count == 1) // exactly one match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1952 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1953 return m.lastf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1954 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1955 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1956 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1957 OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1958 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1959 buf.writeByte('('); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1960 if (arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1961 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1962 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1963 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1964 argExpTypesToCBuffer(&buf, arguments, &hgs); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1965 buf.writeByte(')'); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1966 if (ethis) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1967 ethis->type->modToBuffer(&buf); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1968 } |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1969 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1970 buf.writeByte(')'); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1971 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1972 if (m.last == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1973 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1974 if (flags & 1) // if do not print error messages |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1975 return NULL; // no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1976 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1977 tf = (TypeFunction *)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1978 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1979 OutBuffer buf2; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1980 tf->modToBuffer(&buf2); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1981 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1982 //printf("tf = %s, args = %s\n", tf->deco, ((Expression *)arguments->data[0])->type->deco); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1983 error(loc, "%s%s is not callable using argument types %s", |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1984 Argument::argsTypesToChars(tf->parameters, tf->varargs), |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1985 buf2.toChars(), |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1986 buf.toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1987 return m.anyf; // as long as it's not a FuncAliasDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1988 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1989 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1990 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1991 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1992 TypeFunction *t1 = (TypeFunction *)m.lastf->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1993 TypeFunction *t2 = (TypeFunction *)m.nextf->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1994 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1995 error(loc, "called with argument types:\n\t(%s)\nmatches both:\n\t%s%s\nand:\n\t%s%s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1996 buf.toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1997 m.lastf->toPrettyChars(), Argument::argsTypesToChars(t1->parameters, t1->varargs), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1998 m.nextf->toPrettyChars(), Argument::argsTypesToChars(t2->parameters, t2->varargs)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
1999 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2000 error(loc, "overloads %s and %s both match argument list for %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2001 m.lastf->type->toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2002 m.nextf->type->toChars(), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2003 m.lastf->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2004 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2005 return m.lastf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2006 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2007 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2008 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2009 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2010 /************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2011 * Determine partial specialization order of 'this' vs g. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2012 * This is very similar to TemplateDeclaration::leastAsSpecialized(). |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2013 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2014 * match 'this' is at least as specialized as g |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2015 * 0 g is more specialized than 'this' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2016 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2017 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2018 MATCH FuncDeclaration::leastAsSpecialized(FuncDeclaration *g) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2019 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2020 #define LOG_LEASTAS 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2021 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2022 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2023 printf("%s.leastAsSpecialized(%s)\n", toChars(), g->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2024 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2025 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2026 /* This works by calling g() with f()'s parameters, and |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2027 * if that is possible, then f() is at least as specialized |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2028 * as g() is. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2029 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2030 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2031 TypeFunction *tf = (TypeFunction *)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2032 TypeFunction *tg = (TypeFunction *)g->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2033 size_t nfparams = Argument::dim(tf->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2034 size_t ngparams = Argument::dim(tg->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2035 MATCH match = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2036 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2037 /* If both functions have a 'this' pointer, and the mods are not |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2038 * the same and g's is not const, then this is less specialized. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2039 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2040 if (needThis() && g->needThis()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2041 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2042 if (tf->mod != tg->mod) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2043 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2044 if (tg->mod == MODconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2045 match = MATCHconst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2046 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2047 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2048 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2049 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2050 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2051 /* Create a dummy array of arguments out of the parameters to f() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2052 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2053 Expressions args; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2054 args.setDim(nfparams); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2055 for (int u = 0; u < nfparams; u++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2056 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2057 Argument *p = Argument::getNth(tf->parameters, u); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2058 Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2059 if (p->storageClass & (STCref | STCout)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2060 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2061 e = new IdentifierExp(0, p->ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2062 e->type = p->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2063 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2064 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2065 e = p->type->defaultInit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2066 args.data[u] = e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2067 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2068 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2069 MATCH m = (MATCH) tg->callMatch(NULL, &args); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2070 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2071 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2072 /* A variadic parameter list is less specialized than a |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2073 * non-variadic one. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2074 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2075 if (tf->varargs && !tg->varargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2076 goto L1; // less specialized |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2077 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2078 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2079 printf(" matches %d, so is least as specialized\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2080 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2081 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2082 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2083 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2084 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2085 printf(" doesn't match, so is not as specialized\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2086 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2087 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2088 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2089 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2090 /******************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2091 * Given a symbol that could be either a FuncDeclaration or |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2092 * a function template, resolve it to a function symbol. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2093 * sc instantiation scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2094 * loc instantiation location |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2095 * targsi initial list of template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2096 * ethis if !NULL, the 'this' pointer argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2097 * fargs arguments to function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2098 * flags 1: do not issue error message on no match, just return NULL |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2099 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2100 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2101 FuncDeclaration *resolveFuncCall(Scope *sc, Loc loc, Dsymbol *s, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2102 Objects *tiargs, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2103 Expression *ethis, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2104 Expressions *arguments, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2105 int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2106 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2107 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2108 return NULL; // no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2109 FuncDeclaration *f = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2110 if (f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2111 f = f->overloadResolve(loc, ethis, arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2112 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2113 { TemplateDeclaration *td = s->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2114 assert(td); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2115 f = td->deduceFunctionTemplate(sc, loc, tiargs, NULL, arguments, flags); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2116 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2117 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2118 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2119 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2120 /******************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2121 * Labels are in a separate scope, one per function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2122 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2123 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2124 LabelDsymbol *FuncDeclaration::searchLabel(Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2125 { Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2126 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2127 if (!labtab) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2128 labtab = new DsymbolTable(); // guess we need one |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2129 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2130 s = labtab->lookup(ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2131 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2132 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2133 s = new LabelDsymbol(ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2134 labtab->insert(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2135 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2136 return (LabelDsymbol *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2137 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2138 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2139 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2140 * If non-static member function that has a 'this' pointer, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2141 * return the aggregate it is a member of. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2142 * Otherwise, return NULL. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2143 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2144 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2145 AggregateDeclaration *FuncDeclaration::isThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2146 { AggregateDeclaration *ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2147 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2148 //printf("+FuncDeclaration::isThis() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2149 ad = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2150 if ((storage_class & STCstatic) == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2151 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2152 ad = isMember2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2153 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2154 //printf("-FuncDeclaration::isThis() %p\n", ad); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2155 return ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2156 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2157 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2158 AggregateDeclaration *FuncDeclaration::isMember2() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2159 { AggregateDeclaration *ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2160 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2161 //printf("+FuncDeclaration::isMember2() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2162 ad = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2163 for (Dsymbol *s = this; s; s = s->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2164 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2165 //printf("\ts = '%s', parent = '%s', kind = %s\n", s->toChars(), s->parent->toChars(), s->parent->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2166 ad = s->isMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2167 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2168 { //printf("test4\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2169 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2170 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2171 if (!s->parent || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2172 (!s->parent->isTemplateInstance())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2173 { //printf("test5\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2174 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2175 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2176 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2177 //printf("-FuncDeclaration::isMember2() %p\n", ad); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2178 return ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2179 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2181 /***************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2182 * Determine lexical level difference from 'this' to nested function 'fd'. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2183 * Error if this cannot call fd. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2184 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2185 * 0 same level |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2186 * -1 increase nesting by 1 (fd is nested within 'this') |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2187 * >0 decrease nesting by number |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2188 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2189 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2190 int FuncDeclaration::getLevel(Loc loc, FuncDeclaration *fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2191 { int level; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2192 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2193 Dsymbol *fdparent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2194 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2195 //printf("FuncDeclaration::getLevel(fd = '%s')\n", fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2196 fdparent = fd->toParent2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2197 if (fdparent == this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2198 return -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2199 s = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2200 level = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2201 while (fd != s && fdparent != s->toParent2()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2202 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2203 //printf("\ts = '%s'\n", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2204 FuncDeclaration *thisfd = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2205 if (thisfd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2206 { if (!thisfd->isNested() && !thisfd->vthis) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2207 goto Lerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2208 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2209 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2210 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2211 AggregateDeclaration *thiscd = s->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2212 if (thiscd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2213 { if (!thiscd->isNested()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2214 goto Lerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2215 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2216 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2217 goto Lerr; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2218 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2219 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2220 s = s->toParent2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2221 assert(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2222 level++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2223 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2224 return level; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2225 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2226 Lerr: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2227 error(loc, "cannot access frame of function %s", fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2228 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2229 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2230 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2231 void FuncDeclaration::appendExp(Expression *e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2232 { Statement *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2233 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2234 s = new ExpStatement(0, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2235 appendState(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2236 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2237 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2238 void FuncDeclaration::appendState(Statement *s) |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2239 { |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2240 if (!fbody) |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2241 fbody = s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2242 else |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2243 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2244 CompoundStatement *cs = fbody->isCompoundStatement(); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2245 if (cs) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2246 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2247 if (!cs->statements) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2248 fbody = s; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2249 else |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2250 cs->statements->push(s); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2251 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2252 else |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2253 fbody = new CompoundStatement(0, fbody, s); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2254 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2255 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2256 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2257 const char *FuncDeclaration::toPrettyChars() |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2258 { |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2259 if (isMain()) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2260 return "D main"; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2261 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2262 return Dsymbol::toPrettyChars(); |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2263 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2264 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2265 int FuncDeclaration::isMain() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2266 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2267 return ident == Id::main && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2268 linkage != LINKc && !isMember() && !isNested(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2269 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2270 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2271 int FuncDeclaration::isWinMain() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2272 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2273 //printf("FuncDeclaration::isWinMain() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2274 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2275 int x = ident == Id::WinMain && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2276 linkage != LINKc && !isMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2277 printf("%s\n", x ? "yes" : "no"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2278 return x; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2279 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2280 return ident == Id::WinMain && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2281 linkage != LINKc && !isMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2282 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2283 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2284 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2285 int FuncDeclaration::isDllMain() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2286 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2287 return ident == Id::DllMain && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2288 linkage != LINKc && !isMember(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2289 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2290 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2291 int FuncDeclaration::isExport() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2292 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2293 return protection == PROTexport; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2294 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2295 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2296 int FuncDeclaration::isImportedSymbol() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2297 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2298 //printf("isImportedSymbol()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2299 //printf("protection = %d\n", protection); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2300 return (protection == PROTexport) && !fbody; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2301 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2302 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2303 // Determine if function goes into virtual function pointer table |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2304 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2305 int FuncDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2306 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2307 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2308 printf("FuncDeclaration::isVirtual(%s)\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2309 printf("isMember:%p isStatic:%d private:%d ctor:%d !Dlinkage:%d\n", isMember(), isStatic(), protection == PROTprivate, isCtorDeclaration(), linkage != LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2310 printf("result is %d\n", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2311 isMember() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2312 !(isStatic() || protection == PROTprivate || protection == PROTpackage) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2313 toParent()->isClassDeclaration()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2314 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2315 return isMember() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2316 !(isStatic() || protection == PROTprivate || protection == PROTpackage) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2317 toParent()->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2318 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2319 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2320 int FuncDeclaration::isFinal() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2321 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2322 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2323 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2324 printf("FuncDeclaration::isFinal(%s)\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2325 printf("%p %d %d %d %d\n", isMember(), isStatic(), protection == PROTprivate, isCtorDeclaration(), linkage != LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2326 printf("result is %d\n", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2327 isMember() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2328 !(isStatic() || protection == PROTprivate || protection == PROTpackage) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2329 (cd = toParent()->isClassDeclaration()) != NULL && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2330 cd->storage_class & STCfinal); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2331 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2332 return isMember() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2333 (Declaration::isFinal() || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2334 ((cd = toParent()->isClassDeclaration()) != NULL && cd->storage_class & STCfinal)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2335 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2336 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2337 int FuncDeclaration::isAbstract() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2338 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2339 return storage_class & STCabstract; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2340 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2341 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2342 int FuncDeclaration::isCodeseg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2343 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2344 return TRUE; // functions are always in the code segment |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2345 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2346 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2347 int FuncDeclaration::isOverloadable() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2348 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2349 return 1; // functions can be overloaded |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2350 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2351 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2352 int FuncDeclaration::isPure() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2353 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2354 //printf("FuncDeclaration::isPure() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2355 assert(type->ty == Tfunction); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2356 return ((TypeFunction *)this->type)->ispure; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2357 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2358 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2359 // Determine if function needs |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2360 // a static frame pointer to its lexically enclosing function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2361 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2362 int FuncDeclaration::isNested() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2363 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2364 //if (!toParent()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2365 //printf("FuncDeclaration::isNested('%s') parent=%p\n", toChars(), parent); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2366 //printf("\ttoParent2() = '%s'\n", toParent2()->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2367 return ((storage_class & STCstatic) == 0) && toParent2() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2368 (toParent2()->isFuncDeclaration() != NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2369 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2370 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2371 int FuncDeclaration::needThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2372 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2373 //printf("FuncDeclaration::needThis() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2374 int i = isThis() != NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2375 //printf("\t%d\n", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2376 if (!i && isFuncAliasDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2377 i = ((FuncAliasDeclaration *)this)->funcalias->needThis(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2378 return i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2379 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2380 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2381 int FuncDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2382 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2383 AggregateDeclaration *ad = isThis(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2384 return (ad && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2385 //ad->isClassDeclaration() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2386 global.params.useInvariants && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2387 (protection == PROTpublic || protection == PROTexport) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2388 !naked && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2389 ident != Id::cpctor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2390 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2391 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2392 int FuncDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2393 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2394 AggregateDeclaration *ad = isThis(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2395 return (ad && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2396 ad->inv && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2397 //ad->isClassDeclaration() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2398 global.params.useInvariants && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2399 (protection == PROTpublic || protection == PROTexport) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2400 !naked && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2401 ident != Id::cpctor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2402 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2403 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2404 /********************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2405 * Generate a FuncDeclaration for a runtime library function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2406 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2407 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2408 // |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2409 // LDC: Adjusted to give argument info to the runtime function decl. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2410 // |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2411 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2412 FuncDeclaration *FuncDeclaration::genCfunc(Arguments *args, Type *treturn, const char *name) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2413 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2414 return genCfunc(args, treturn, Lexer::idPool(name)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2415 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2416 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2417 FuncDeclaration *FuncDeclaration::genCfunc(Arguments *args, Type *treturn, Identifier *id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2418 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2419 FuncDeclaration *fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2420 TypeFunction *tf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2421 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2422 static DsymbolTable *st = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2423 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2424 //printf("genCfunc(name = '%s')\n", id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2425 //printf("treturn\n\t"); treturn->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2426 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2427 // See if already in table |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2428 if (!st) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2429 st = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2430 s = st->lookup(id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2431 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2432 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2433 fd = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2434 assert(fd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2435 assert(fd->type->nextOf()->equals(treturn)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2436 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2437 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2438 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2439 tf = new TypeFunction(args, treturn, 0, LINKc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2440 fd = new FuncDeclaration(0, 0, id, STCstatic, tf); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2441 fd->protection = PROTpublic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2442 fd->linkage = LINKc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2443 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2444 st->insert(fd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2445 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2446 return fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2447 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2448 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2449 const char *FuncDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2450 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2451 return "function"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2452 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2453 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2454 /******************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2455 * Look at all the variables in this function that are referenced |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2456 * by nested functions, and determine if a closure needs to be |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2457 * created for them. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2458 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2459 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2460 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2461 int FuncDeclaration::needsClosure() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2462 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2463 /* Need a closure for all the closureVars[] if any of the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2464 * closureVars[] are accessed by a |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2465 * function that escapes the scope of this function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2466 * We take the conservative approach and decide that any function that: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2467 * 1) is a virtual function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2468 * 2) has its address taken |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2469 * 3) has a parent that escapes |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2470 * |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2471 * Note that since a non-virtual function can be called by |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2472 * a virtual one, if that non-virtual function accesses a closure |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2473 * var, the closure still has to be taken. Hence, we check for isThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2474 * instead of isVirtual(). (thanks to David Friedman) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2475 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2476 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2477 //printf("FuncDeclaration::needsClosure() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2478 for (int i = 0; i < closureVars.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2479 { VarDeclaration *v = (VarDeclaration *)closureVars.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2480 assert(v->isVarDeclaration()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2481 //printf("\tv = %s\n", v->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2482 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2483 for (int j = 0; j < v->nestedrefs.dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2484 { FuncDeclaration *f = (FuncDeclaration *)v->nestedrefs.data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2485 assert(f != this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2486 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2487 //printf("\t\tf = %s, %d, %p, %d\n", f->toChars(), f->isVirtual(), f->isThis(), f->tookAddressOf); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2488 if (f->isThis() || f->tookAddressOf) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2489 goto Lyes; // assume f escapes this function's scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2490 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2491 // Look to see if any parents of f that are below this escape |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2492 for (Dsymbol *s = f->parent; s && s != this; s = s->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2493 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2494 f = s->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2495 if (f && (f->isThis() || f->tookAddressOf)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2496 goto Lyes; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2497 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2498 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2499 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2500 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2501 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2502 Lyes: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2503 //printf("\tneeds closure\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2504 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2505 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2506 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2507 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2508 /****************************** FuncAliasDeclaration ************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2509 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2510 // Used as a way to import a set of functions from another scope into this one. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2511 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2512 FuncAliasDeclaration::FuncAliasDeclaration(FuncDeclaration *funcalias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2513 : FuncDeclaration(funcalias->loc, funcalias->endloc, funcalias->ident, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2514 (enum STC)funcalias->storage_class, funcalias->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2515 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2516 assert(funcalias != this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2517 this->funcalias = funcalias; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2518 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2519 importprot = PROTundefined; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2520 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2521 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2522 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2523 const char *FuncAliasDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2524 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2525 return "function alias"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2526 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2527 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2528 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2529 /****************************** FuncLiteralDeclaration ************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2530 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2531 FuncLiteralDeclaration::FuncLiteralDeclaration(Loc loc, Loc endloc, Type *type, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2532 enum TOK tok, ForeachStatement *fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2533 : FuncDeclaration(loc, endloc, NULL, STCundefined, type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2534 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2535 const char *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2536 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2537 if (fes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2538 id = "__foreachbody"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2539 else if (tok == TOKdelegate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2540 id = "__dgliteral"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2541 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2542 id = "__funcliteral"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2543 this->ident = Lexer::uniqueId(id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2544 this->tok = tok; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2545 this->fes = fes; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2546 //printf("FuncLiteralDeclaration() id = '%s', type = '%s'\n", this->ident->toChars(), type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2547 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2548 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2549 Dsymbol *FuncLiteralDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2550 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2551 FuncLiteralDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2552 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2553 //printf("FuncLiteralDeclaration::syntaxCopy('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2554 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2555 f = (FuncLiteralDeclaration *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2556 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2557 { f = new FuncLiteralDeclaration(loc, endloc, type->syntaxCopy(), tok, fes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2558 f->ident = ident; // keep old identifier |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2559 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2560 FuncDeclaration::syntaxCopy(f); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2561 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2562 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2563 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2564 int FuncLiteralDeclaration::isNested() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2565 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2566 //printf("FuncLiteralDeclaration::isNested() '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2567 return (tok == TOKdelegate); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2568 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2569 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2570 int FuncLiteralDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2571 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2572 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2573 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2574 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2575 const char *FuncLiteralDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2576 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2577 // GCC requires the (char*) casts |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2578 return (tok == TOKdelegate) ? (char*)"delegate" : (char*)"function"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2579 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2580 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2581 void FuncLiteralDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2582 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2583 static Identifier *idfunc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2584 static Identifier *iddel; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2585 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2586 if (!idfunc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2587 idfunc = new Identifier("function", 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2588 if (!iddel) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2589 iddel = new Identifier("delegate", 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2590 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2591 type->toCBuffer(buf, ((tok == TOKdelegate) ? iddel : idfunc), hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2592 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2593 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2594 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2595 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2596 /********************************* CtorDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2597 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2598 CtorDeclaration::CtorDeclaration(Loc loc, Loc endloc, Arguments *arguments, int varargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2599 : FuncDeclaration(loc, endloc, Id::ctor, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2600 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2601 this->arguments = arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2602 this->varargs = varargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2603 //printf("CtorDeclaration(loc = %s) %s\n", loc.toChars(), toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2604 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2605 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2606 Dsymbol *CtorDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2607 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2608 CtorDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2609 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2610 f = new CtorDeclaration(loc, endloc, NULL, varargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2611 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2612 f->outId = outId; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2613 f->frequire = frequire ? frequire->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2614 f->fensure = fensure ? fensure->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2615 f->fbody = fbody ? fbody->syntaxCopy() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2616 assert(!fthrows); // deprecated |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2617 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2618 f->arguments = Argument::arraySyntaxCopy(arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2619 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2620 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2621 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2622 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2623 void CtorDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2624 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2625 AggregateDeclaration *ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2626 Type *tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2627 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2628 //printf("CtorDeclaration::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2629 if (type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2630 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2631 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2632 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2633 sc->stc &= ~STCstatic; // not a static constructor |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2634 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2635 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2636 Dsymbol *parent = toParent2(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2637 ad = parent->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2638 if (!ad || parent->isUnionDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2639 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2640 error("constructors are only for class or struct definitions"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2641 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2642 tret = Type::tvoid; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2643 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2644 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2645 { tret = ad->handle; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2646 assert(tret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2647 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2648 type = new TypeFunction(arguments, tret, varargs, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2649 #if STRUCTTHISREF |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2650 if (ad && ad->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2651 ((TypeFunction *)type)->isref = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2652 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2653 if (!originalType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2654 originalType = type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2655 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2656 sc->flags |= SCOPEctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2657 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2658 sc->flags &= ~SCOPEctor; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2659 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2660 // Append: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2661 // return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2662 // to the function body |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2663 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2664 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2665 Expression *e = new ThisExp(loc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2666 Statement *s = new ReturnStatement(loc, e); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2667 fbody = new CompoundStatement(loc, fbody, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2668 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2669 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2670 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2671 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2672 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2673 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2674 // See if it's the default constructor |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2675 if (ad && varargs == 0 && Argument::dim(arguments) == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2676 { if (ad->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2677 error("default constructor not allowed for structs"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2678 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2679 ad->defaultCtor = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2680 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2681 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2682 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2683 const char *CtorDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2684 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2685 return "constructor"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2686 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2687 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2688 char *CtorDeclaration::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2689 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2690 return (char *)"this"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2691 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2692 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2693 int CtorDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2694 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2695 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2696 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2697 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2698 int CtorDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2699 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2700 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2701 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2702 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2703 int CtorDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2704 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2705 return (isThis() && vthis && global.params.useInvariants); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2706 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2707 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2708 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2709 void CtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2710 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2711 buf->writestring("this"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2712 Argument::argsToCBuffer(buf, hgs, arguments, varargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2713 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2714 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2715 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2716 /********************************* PostBlitDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2717 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2718 #if DMDV2 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2719 PostBlitDeclaration::PostBlitDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2720 : FuncDeclaration(loc, endloc, Id::_postblit, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2721 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2722 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2723 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2724 PostBlitDeclaration::PostBlitDeclaration(Loc loc, Loc endloc, Identifier *id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2725 : FuncDeclaration(loc, endloc, id, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2726 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2727 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2728 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2729 Dsymbol *PostBlitDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2730 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2731 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2732 PostBlitDeclaration *dd = new PostBlitDeclaration(loc, endloc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2733 return FuncDeclaration::syntaxCopy(dd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2734 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2735 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2736 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2737 void PostBlitDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2738 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2739 //printf("PostBlitDeclaration::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2740 //printf("ident: %s, %s, %p, %p\n", ident->toChars(), Id::dtor->toChars(), ident, Id::dtor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2741 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2742 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2743 StructDeclaration *ad = parent->isStructDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2744 if (!ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2745 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2746 error("post blits are only for struct/union definitions, not %s %s", parent->kind(), parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2747 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2748 else if (ident == Id::_postblit) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2749 ad->postblits.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2750 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2751 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2752 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2753 sc->stc &= ~STCstatic; // not static |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2754 sc->linkage = LINKd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2755 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2756 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2757 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2758 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2759 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2760 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2761 int PostBlitDeclaration::overloadInsert(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2762 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2763 return FALSE; // cannot overload postblits |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2764 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2765 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2766 int PostBlitDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2767 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2768 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2769 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2770 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2771 int PostBlitDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2772 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2773 return (isThis() && vthis && global.params.useInvariants); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2774 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2775 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2776 int PostBlitDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2777 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2778 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2779 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2780 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2781 void PostBlitDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2782 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2783 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2784 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2785 buf->writestring("=this()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2786 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2787 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1487
diff
changeset
|
2788 #endif |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2789 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2790 /********************************* DtorDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2791 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2792 DtorDeclaration::DtorDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2793 : FuncDeclaration(loc, endloc, Id::dtor, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2794 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2795 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2796 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2797 DtorDeclaration::DtorDeclaration(Loc loc, Loc endloc, Identifier *id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2798 : FuncDeclaration(loc, endloc, id, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2799 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2800 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2801 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2802 Dsymbol *DtorDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2803 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2804 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2805 DtorDeclaration *dd = new DtorDeclaration(loc, endloc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2806 return FuncDeclaration::syntaxCopy(dd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2807 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2808 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2809 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2810 void DtorDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2811 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2812 //printf("DtorDeclaration::semantic() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2813 //printf("ident: %s, %s, %p, %p\n", ident->toChars(), Id::dtor->toChars(), ident, Id::dtor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2814 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2815 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2816 AggregateDeclaration *ad = parent->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2817 if (!ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2818 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2819 error("destructors are only for class/struct/union definitions, not %s %s", parent->kind(), parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2820 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2821 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2822 else if (ident == Id::dtor) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2823 ad->dtors.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2824 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2826 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2827 sc->stc &= ~STCstatic; // not a static destructor |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2828 sc->linkage = LINKd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2829 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2830 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2831 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2832 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2833 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2834 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2835 int DtorDeclaration::overloadInsert(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2836 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2837 return FALSE; // cannot overload destructors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2838 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2839 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2840 int DtorDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2841 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2842 return (isThis() && vthis && global.params.useInvariants); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2843 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2844 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2845 int DtorDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2846 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2847 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2848 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2849 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2850 const char *DtorDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2851 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2852 return "destructor"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2853 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2854 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2855 char *DtorDeclaration::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2856 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2857 return (char *)"~this"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2858 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2859 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2860 int DtorDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2861 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2862 /* This should be FALSE so that dtor's don't get put into the vtbl[], |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2863 * but doing so will require recompiling everything. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2864 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2865 #if BREAKABI |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2866 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2867 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2868 return FuncDeclaration::isVirtual(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2869 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2870 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2871 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2872 void DtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2873 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2874 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2875 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2876 buf->writestring("~this()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2877 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2878 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2879 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2880 /********************************* StaticCtorDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2881 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2882 StaticCtorDeclaration::StaticCtorDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2883 : FuncDeclaration(loc, endloc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2884 Identifier::generateId("_staticCtor"), STCstatic, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2885 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2886 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2887 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2888 Dsymbol *StaticCtorDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2889 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2890 StaticCtorDeclaration *scd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2891 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2892 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2893 scd = new StaticCtorDeclaration(loc, endloc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2894 return FuncDeclaration::syntaxCopy(scd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2895 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2896 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2897 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2898 void StaticCtorDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2899 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2900 //printf("StaticCtorDeclaration::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2901 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2902 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2903 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2904 /* If the static ctor appears within a template instantiation, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2905 * it could get called multiple times by the module constructors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2906 * for different modules. Thus, protect it with a gate. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2907 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2908 if (inTemplateInstance()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2909 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2910 /* Add this prefix to the function: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2911 * static int gate; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2912 * if (++gate != 1) return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2913 * Note that this is not thread safe; should not have threads |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2914 * during static construction. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2915 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2916 Identifier *id = Lexer::idPool("__gate"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2917 VarDeclaration *v = new VarDeclaration(0, Type::tint32, id, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2918 v->storage_class = STCstatic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2919 Statements *sa = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2920 Statement *s = new DeclarationStatement(0, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2921 sa->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2922 Expression *e = new IdentifierExp(0, id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2923 e = new AddAssignExp(0, e, new IntegerExp(1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2924 e = new EqualExp(TOKnotequal, 0, e, new IntegerExp(1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2925 s = new IfStatement(0, NULL, e, new ReturnStatement(0, NULL), NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2926 sa->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2927 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2928 sa->push(fbody); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2929 fbody = new CompoundStatement(0, sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2930 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2931 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2932 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2933 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2934 // We're going to need ModuleInfo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2935 Module *m = getModule(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2936 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2937 m = sc->module; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2938 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2939 { m->needmoduleinfo = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2940 #ifdef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2941 m->strictlyneedmoduleinfo = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2942 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2943 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2944 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2945 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2946 AggregateDeclaration *StaticCtorDeclaration::isThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2947 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2948 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2949 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2950 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2951 int StaticCtorDeclaration::isStaticConstructor() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2952 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2953 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2954 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2955 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2956 int StaticCtorDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2957 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2958 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2959 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2960 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2961 int StaticCtorDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2962 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2963 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2964 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2965 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2966 int StaticCtorDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2967 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2968 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2969 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2970 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2971 void StaticCtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2972 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2973 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2974 { buf->writestring("static this();\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2975 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2976 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2977 buf->writestring("static this()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2978 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2979 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2980 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2981 /********************************* StaticDtorDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2982 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2983 StaticDtorDeclaration::StaticDtorDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2984 : FuncDeclaration(loc, endloc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2985 Identifier::generateId("_staticDtor"), STCstatic, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2986 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2987 vgate = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2988 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2989 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2990 Dsymbol *StaticDtorDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2991 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2992 StaticDtorDeclaration *sdd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2993 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2994 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2995 sdd = new StaticDtorDeclaration(loc, endloc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2996 return FuncDeclaration::syntaxCopy(sdd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2997 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2998 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
2999 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3000 void StaticDtorDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3001 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3002 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3003 Type *tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3004 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3005 cd = sc->scopesym->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3006 if (!cd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3007 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3008 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3009 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3010 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3011 /* If the static ctor appears within a template instantiation, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3012 * it could get called multiple times by the module constructors |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3013 * for different modules. Thus, protect it with a gate. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3014 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3015 if (inTemplateInstance()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3016 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3017 /* Add this prefix to the function: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3018 * static int gate; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3019 * if (--gate != 0) return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3020 * Increment gate during constructor execution. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3021 * Note that this is not thread safe; should not have threads |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3022 * during static destruction. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3023 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3024 Identifier *id = Lexer::idPool("__gate"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3025 VarDeclaration *v = new VarDeclaration(0, Type::tint32, id, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3026 v->storage_class = STCstatic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3027 Statements *sa = new Statements(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3028 Statement *s = new DeclarationStatement(0, v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3029 sa->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3030 Expression *e = new IdentifierExp(0, id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3031 e = new AddAssignExp(0, e, new IntegerExp((uint64_t)-1)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3032 e = new EqualExp(TOKnotequal, 0, e, new IntegerExp(0)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3033 s = new IfStatement(0, NULL, e, new ReturnStatement(0, NULL), NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3034 sa->push(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3035 if (fbody) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3036 sa->push(fbody); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3037 fbody = new CompoundStatement(0, sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3038 vgate = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3039 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3040 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3041 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3042 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3043 // We're going to need ModuleInfo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3044 Module *m = getModule(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3045 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3046 m = sc->module; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3047 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3048 { m->needmoduleinfo = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3049 #ifdef IN_GCC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3050 m->strictlyneedmoduleinfo = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3051 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3052 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3053 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3054 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3055 AggregateDeclaration *StaticDtorDeclaration::isThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3056 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3057 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3058 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3059 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3060 int StaticDtorDeclaration::isStaticDestructor() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3061 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3062 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3063 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3064 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3065 int StaticDtorDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3066 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3067 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3068 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3069 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3070 int StaticDtorDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3071 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3072 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3073 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3074 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3075 int StaticDtorDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3076 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3077 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3078 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3079 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3080 void StaticDtorDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3081 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3082 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3083 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3084 buf->writestring("static ~this()"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3085 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3086 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3087 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3088 /********************************* InvariantDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3089 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3090 InvariantDeclaration::InvariantDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3091 : FuncDeclaration(loc, endloc, Id::classInvariant, STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3092 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3093 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3094 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3095 Dsymbol *InvariantDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3096 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3097 InvariantDeclaration *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3098 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3099 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3100 id = new InvariantDeclaration(loc, endloc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3101 FuncDeclaration::syntaxCopy(id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3102 return id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3103 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3104 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3105 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3106 void InvariantDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3107 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3108 AggregateDeclaration *ad; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3109 Type *tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3110 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3111 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3112 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3113 ad = parent->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3114 if (!ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3115 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3116 error("invariants are only for struct/union/class definitions"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3117 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3118 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3119 else if (ad->inv && ad->inv != this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3120 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3121 error("more than one invariant for %s", ad->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3122 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3123 ad->inv = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3124 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3125 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3126 sc = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3127 sc->stc &= ~STCstatic; // not a static invariant |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3128 sc->incontract++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3129 sc->linkage = LINKd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3130 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3131 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3132 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3133 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3134 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3135 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3136 int InvariantDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3137 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3138 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3139 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3140 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3141 int InvariantDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3142 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3143 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3144 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3145 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3146 int InvariantDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3147 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3148 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3149 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3150 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3151 void InvariantDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3152 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3153 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3154 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3155 buf->writestring("invariant"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3156 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3157 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3158 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3159 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3160 /********************************* UnitTestDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3161 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3162 /******************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3163 * Generate unique unittest function Id so we can have multiple |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3164 * instances per module. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3165 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3166 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3167 static Identifier *unitTestId() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3168 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3169 return Lexer::uniqueId("__unittest"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3170 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3171 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3172 UnitTestDeclaration::UnitTestDeclaration(Loc loc, Loc endloc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3173 : FuncDeclaration(loc, endloc, unitTestId(), STCundefined, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3174 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3175 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3176 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3177 Dsymbol *UnitTestDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3178 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3179 UnitTestDeclaration *utd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3181 assert(!s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3182 utd = new UnitTestDeclaration(loc, endloc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3183 return FuncDeclaration::syntaxCopy(utd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3184 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3185 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3186 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3187 void UnitTestDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3188 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3189 if (global.params.useUnitTests) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3190 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3191 type = new TypeFunction(NULL, Type::tvoid, FALSE, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3192 Scope *sc2 = sc->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3193 sc2->linkage = LINKd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3194 FuncDeclaration::semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3195 sc2->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3196 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3197 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3198 // We're going to need ModuleInfo even if the unit tests are not |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3199 // compiled in, because other modules may import this module and refer |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3200 // to this ModuleInfo. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3201 Module *m = getModule(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3202 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3203 m = sc->module; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3204 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3205 m->needmoduleinfo = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3206 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3207 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3208 AggregateDeclaration *UnitTestDeclaration::isThis() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3209 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3210 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3211 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3212 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3213 int UnitTestDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3214 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3215 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3216 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3217 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3218 int UnitTestDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3219 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3220 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3221 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3222 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3223 int UnitTestDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3224 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3225 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3226 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3227 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3228 void UnitTestDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3229 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3230 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3231 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3232 buf->writestring("unittest"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3233 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3234 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3235 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3236 /********************************* NewDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3237 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3238 NewDeclaration::NewDeclaration(Loc loc, Loc endloc, Arguments *arguments, int varargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3239 : FuncDeclaration(loc, endloc, Id::classNew, STCstatic, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3240 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3241 this->arguments = arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3242 this->varargs = varargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3243 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3244 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3245 Dsymbol *NewDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3246 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3247 NewDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3248 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3249 f = new NewDeclaration(loc, endloc, NULL, varargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3250 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3251 FuncDeclaration::syntaxCopy(f); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3252 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3253 f->arguments = Argument::arraySyntaxCopy(arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3254 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3255 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3256 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3257 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3258 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3259 void NewDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3260 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3261 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3262 Type *tret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3263 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3264 //printf("NewDeclaration::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3265 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3266 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3267 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3268 cd = parent->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3269 if (!cd && !parent->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3270 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3271 error("new allocators only are for class or struct definitions"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3272 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3273 tret = Type::tvoid->pointerTo(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3274 type = new TypeFunction(arguments, tret, varargs, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3275 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3276 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3277 assert(type->ty == Tfunction); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3278 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3279 // Check that there is at least one argument of type size_t |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3280 TypeFunction *tf = (TypeFunction *)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3281 if (Argument::dim(tf->parameters) < 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3282 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3283 error("at least one argument of type size_t expected"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3284 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3285 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3286 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3287 Argument *a = Argument::getNth(tf->parameters, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3288 if (!a->type->equals(Type::tsize_t)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3289 error("first argument must be type size_t, not %s", a->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3290 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3291 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3292 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3293 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3294 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3295 const char *NewDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3296 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3297 return "allocator"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3298 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3299 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3300 int NewDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3301 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3302 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3303 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3304 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3305 int NewDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3306 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3307 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3308 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3309 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3310 int NewDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3311 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3312 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3313 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3314 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3315 void NewDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3316 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3317 buf->writestring("new"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3318 Argument::argsToCBuffer(buf, hgs, arguments, varargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3319 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3320 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3321 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3322 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3323 /********************************* DeleteDeclaration ****************************/ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3324 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3325 DeleteDeclaration::DeleteDeclaration(Loc loc, Loc endloc, Arguments *arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3326 : FuncDeclaration(loc, endloc, Id::classDelete, STCstatic, NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3327 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3328 this->arguments = arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3329 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3330 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3331 Dsymbol *DeleteDeclaration::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3332 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3333 DeleteDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3334 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3335 f = new DeleteDeclaration(loc, endloc, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3336 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3337 FuncDeclaration::syntaxCopy(f); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3338 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3339 f->arguments = Argument::arraySyntaxCopy(arguments); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3340 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3341 return f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3342 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3343 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3344 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3345 void DeleteDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3346 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3347 ClassDeclaration *cd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3348 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3349 //printf("DeleteDeclaration::semantic()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3350 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3351 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3352 Dsymbol *parent = toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3353 cd = parent->isClassDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3354 if (!cd && !parent->isStructDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3355 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3356 error("new allocators only are for class or struct definitions"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3357 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3358 type = new TypeFunction(arguments, Type::tvoid, 0, LINKd); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3359 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3360 type = type->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3361 assert(type->ty == Tfunction); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3362 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3363 // Check that there is only one argument of type void* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3364 TypeFunction *tf = (TypeFunction *)type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3365 if (Argument::dim(tf->parameters) != 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3366 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3367 error("one argument of type void* expected"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3368 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3369 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3370 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3371 Argument *a = Argument::getNth(tf->parameters, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3372 if (!a->type->equals(Type::tvoid->pointerTo())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3373 error("one argument of type void* expected, not %s", a->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3374 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3375 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3376 FuncDeclaration::semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3377 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3378 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3379 const char *DeleteDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3380 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3381 return "deallocator"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3382 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3383 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3384 int DeleteDeclaration::isDelete() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3385 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3386 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3387 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3388 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3389 int DeleteDeclaration::isVirtual() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3390 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3391 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3392 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3393 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3394 int DeleteDeclaration::addPreInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3395 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3396 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3397 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3398 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3399 int DeleteDeclaration::addPostInvariant() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3400 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3401 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3402 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3403 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3404 void DeleteDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3405 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3406 buf->writestring("delete"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3407 Argument::argsToCBuffer(buf, hgs, arguments, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3408 bodyToCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3409 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3410 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3411 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3412 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
945
diff
changeset
|
3413 |