annotate dmd/declaration.c @ 1621:fb2e6707ad17

Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't... Both DMD revisions are for fixing bugzilla 2029 (Typesafe variadic functions don't work in CTFE). The DMD r314 commit message is: bugzilla 2029 (Typesafe variadic functions don't work in CTFE The DMD r315 commit message is: bugzilla 2029 - try again --- dmd/constfold.c | 11 ++++- dmd/declaration.c | 21 +++++++++- dmd/declaration.h | 10 ++++- dmd/expression.c | 1 + dmd/interpret.c | 111 +++++++++++++++++++++++++++++++++++++++++++++-------- dmd/mars.h | 2 +- dmd/mtype.c | 2 +- 7 files changed, 135 insertions(+), 23 deletions(-)
author Leandro Lucarella <llucax@gmail.com>
date Wed, 06 Jan 2010 15:18:22 -0300
parents c61782a76dff
children 44b145be2ef5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
2 // Compiler implementation of the D programming language
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
4 // All Rights Reserved
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
5 // written by Walter Bright
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
6 // http://www.digitalmars.com
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
7 // License for redistribution is by either the Artistic License
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
9 // See the included readme.txt for details.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
10
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
11 #include <stdio.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
12 #include <assert.h>
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
13
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
14 #include "init.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
15 #include "declaration.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
16 #include "attrib.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
17 #include "mtype.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
18 #include "template.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
19 #include "scope.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
20 #include "aggregate.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
21 #include "module.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
22 #include "id.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
23 #include "expression.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
24 #include "hdrgen.h"
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
25
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
26 /********************************* Declaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
27
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
28 Declaration::Declaration(Identifier *id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
29 : Dsymbol(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
30 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
31 type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
32 originalType = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
33 storage_class = STCundefined;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
34 protection = PROTundefined;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
35 linkage = LINKdefault;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
36 inuse = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
37 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
38
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
39 void Declaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
40 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
41 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
42
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
43 const char *Declaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
44 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
45 return "declaration";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
46 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
47
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
48 unsigned Declaration::size(Loc loc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
49 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
50 assert(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
51 return type->size();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
52 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
53
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
54 int Declaration::isStaticConstructor()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
55 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
56 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
57 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
58
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
59 int Declaration::isStaticDestructor()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
60 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
61 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
62 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
63
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
64 int Declaration::isDelete()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
65 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
66 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
67 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
68
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
69 int Declaration::isDataseg()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
70 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
71 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
72 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
73
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
74 int Declaration::isThreadlocal()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
75 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
76 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
77 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
78
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
79 int Declaration::isCodeseg()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
80 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
81 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
82 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
83
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
84 enum PROT Declaration::prot()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
85 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
86 return protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
87 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
88
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
89 /*************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
90 * Check to see if declaration can be modified in this context (sc).
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
91 * Issue error if not.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
92 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
93
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
94 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
95 void Declaration::checkModify(Loc loc, Scope *sc, Type *t)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
96 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
97 if (sc->incontract && isParameter())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
98 error(loc, "cannot modify parameter '%s' in contract", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
99
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
100 if (isCtorinit())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
101 { // It's only modifiable if inside the right constructor
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
102 Dsymbol *s = sc->func;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
103 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
104 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
105 FuncDeclaration *fd = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
106 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
107 fd = s->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
108 if (fd &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
109 ((fd->isCtorDeclaration() && storage_class & STCfield) ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
110 (fd->isStaticCtorDeclaration() && !(storage_class & STCfield))) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
111 fd->toParent() == toParent()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
112 )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
113 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
114 VarDeclaration *v = isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
115 assert(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
116 v->ctorinit = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
117 //printf("setting ctorinit\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
118 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
119 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
120 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
121 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
122 { s = s->toParent2();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
123 continue;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
124 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
125 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
126 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
127 const char *p = isStatic() ? "static " : "";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
128 error(loc, "can only initialize %sconst %s inside %sconstructor",
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
129 p, toChars(), p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
130 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
131 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
132 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
133 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
134 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
135 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
136 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
137 VarDeclaration *v = isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
138 if (v && v->canassign == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
139 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
140 const char *p = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
141 if (isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
142 p = "const";
1619
c61782a76dff Merge DMD r304: refactor invariant => immutable
Leandro Lucarella <llucax@gmail.com>
parents: 1607
diff changeset
143 else if (isImmutable())
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
144 p = "immutable";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
145 else if (storage_class & STCmanifest)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
146 p = "enum";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
147 else if (!t->isAssignable())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
148 p = "struct with immutable members";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
149 if (p)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
150 { error(loc, "cannot modify %s", p);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
151 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
152 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
153 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
154 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
155 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
156
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
157
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
158 /********************************* TupleDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
159
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
160 TupleDeclaration::TupleDeclaration(Loc loc, Identifier *id, Objects *objects)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
161 : Declaration(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
162 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
163 this->type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
164 this->objects = objects;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
165 this->isexp = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
166 this->tupletype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
167 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
168
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
169 Dsymbol *TupleDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
170 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
171 assert(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
172 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
173 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
174
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
175 const char *TupleDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
176 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
177 return "tuple";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
178 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
179
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
180 Type *TupleDeclaration::getType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
181 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
182 /* If this tuple represents a type, return that type
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
183 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
184
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
185 //printf("TupleDeclaration::getType() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
186 if (isexp)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
187 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
188 if (!tupletype)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
189 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
190 /* It's only a type tuple if all the Object's are types
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
191 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
192 for (size_t i = 0; i < objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
193 { Object *o = (Object *)objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
194
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
195 if (o->dyncast() != DYNCAST_TYPE)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
196 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
197 //printf("\tnot[%d], %p, %d\n", i, o, o->dyncast());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
198 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
199 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
200 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
201
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
202 /* We know it's a type tuple, so build the TypeTuple
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
203 */
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
204 Parameters *args = new Parameters();
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
205 args->setDim(objects->dim);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
206 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
207 int hasdeco = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
208 for (size_t i = 0; i < objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
209 { Type *t = (Type *)objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
210
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
211 //printf("type = %s\n", t->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
212 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
213 buf.printf("_%s_%d", ident->toChars(), i);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
214 char *name = (char *)buf.extractData();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
215 Identifier *id = new Identifier(name, TOKidentifier);
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
216 Parameter *arg = new Parameter(STCin, t, id, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
217 #else
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
218 Parameter *arg = new Parameter(STCin, t, NULL, NULL);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
219 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
220 args->data[i] = (void *)arg;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
221 if (!t->deco)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
222 hasdeco = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
223 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
225 tupletype = new TypeTuple(args);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
226 if (hasdeco)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
227 return tupletype->semantic(0, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
228 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
229
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
230 return tupletype;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
231 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
232
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
233 int TupleDeclaration::needThis()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
234 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
235 //printf("TupleDeclaration::needThis(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
236 for (size_t i = 0; i < objects->dim; i++)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
237 { Object *o = (Object *)objects->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
238 if (o->dyncast() == DYNCAST_EXPRESSION)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
239 { Expression *e = (Expression *)o;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
240 if (e->op == TOKdsymbol)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
241 { DsymbolExp *ve = (DsymbolExp *)e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
242 Declaration *d = ve->s->isDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
243 if (d && d->needThis())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
244 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
245 return 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
246 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
247 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
248 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
249 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
250 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
251 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
252
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
253 /********************************* TypedefDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
254
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
255 TypedefDeclaration::TypedefDeclaration(Loc loc, Identifier *id, Type *basetype, Initializer *init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
256 : Declaration(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
257 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
258 this->type = new TypeTypedef(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
259 this->basetype = basetype->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
260 this->init = init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
261 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
262 this->htype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
263 this->hbasetype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
264 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
265 this->sem = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
266 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
267 #if IN_DMD
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
268 this->sinit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
269 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
270 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
271
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
272 Dsymbol *TypedefDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
273 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
274 Type *basetype = this->basetype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
275
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
276 Initializer *init = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
277 if (this->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
278 init = this->init->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
279
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
280 assert(!s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
281 TypedefDeclaration *st;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
282 st = new TypedefDeclaration(loc, ident, basetype, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
283 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
284 // Syntax copy for header file
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
285 if (!htype) // Don't overwrite original
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
286 { if (type) // Make copy for both old and new instances
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
287 { htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
288 st->htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
289 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
290 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
291 else // Make copy of original for new instance
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
292 st->htype = htype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
293 if (!hbasetype)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
294 { if (basetype)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
295 { hbasetype = basetype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
296 st->hbasetype = basetype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
297 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
298 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
299 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
300 st->hbasetype = hbasetype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
301 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
302 return st;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
303 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
304
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
305 void TypedefDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
306 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
307 //printf("TypedefDeclaration::semantic(%s) sem = %d\n", toChars(), sem);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
308 if (sem == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
309 { sem = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
310 basetype = basetype->semantic(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
311 sem = 2;
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
312 #if DMDV2
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
313 type = type->addStorageClass(storage_class);
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
314 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
315 type = type->semantic(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
316 if (sc->parent->isFuncDeclaration() && init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
317 semantic2(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
318 storage_class |= sc->stc & STCdeprecated;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
319 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
320 else if (sem == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
321 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
322 error("circular definition");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
323 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
324 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
325
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
326 void TypedefDeclaration::semantic2(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
327 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
328 //printf("TypedefDeclaration::semantic2(%s) sem = %d\n", toChars(), sem);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
329 if (sem == 2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
330 { sem = 3;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
331 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
332 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
333 init = init->semantic(sc, basetype);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
334
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
335 ExpInitializer *ie = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
336 if (ie)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
337 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
338 if (ie->exp->type == basetype)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
339 ie->exp->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
340 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
341 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
342 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
343 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
344
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
345 const char *TypedefDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
346 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
347 return "typedef";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
348 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
349
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
350 Type *TypedefDeclaration::getType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
351 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
352 return type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
353 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
354
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
355 void TypedefDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
356 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
357 buf->writestring("typedef ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
358 basetype->toCBuffer(buf, ident, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
359 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
360 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
361 buf->writestring(" = ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
362 init->toCBuffer(buf, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
363 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
364 buf->writeByte(';');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
365 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
366 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
367
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
368 /********************************* AliasDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
369
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
370 AliasDeclaration::AliasDeclaration(Loc loc, Identifier *id, Type *type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
371 : Declaration(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
372 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
373 //printf("AliasDeclaration(id = '%s', type = %p)\n", id->toChars(), type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
374 //printf("type = '%s'\n", type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
375 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
376 this->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
377 this->aliassym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
378 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
379 this->htype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
380 this->haliassym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
381 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
382 this->overnext = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
383 this->inSemantic = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
384 this->importprot = PROTundefined;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
385 assert(type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
386 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
387
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
388 AliasDeclaration::AliasDeclaration(Loc loc, Identifier *id, Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
389 : Declaration(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
390 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
391 //printf("AliasDeclaration(id = '%s', s = %p)\n", id->toChars(), s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
392 assert(s != this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
393 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
394 this->type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
395 this->aliassym = s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
396 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
397 this->htype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
398 this->haliassym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
399 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
400 this->overnext = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
401 this->inSemantic = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
402 assert(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
403 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
404
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
405 Dsymbol *AliasDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
406 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
407 //printf("AliasDeclaration::syntaxCopy()\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
408 assert(!s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
409 AliasDeclaration *sa;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
410 if (type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
411 sa = new AliasDeclaration(loc, ident, type->syntaxCopy());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
412 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
413 sa = new AliasDeclaration(loc, ident, aliassym->syntaxCopy(NULL));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
414 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
415 // Syntax copy for header file
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
416 if (!htype) // Don't overwrite original
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
417 { if (type) // Make copy for both old and new instances
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
418 { htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
419 sa->htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
420 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
421 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
422 else // Make copy of original for new instance
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
423 sa->htype = htype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
424 if (!haliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
425 { if (aliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
426 { haliassym = aliassym->syntaxCopy(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
427 sa->haliassym = aliassym->syntaxCopy(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
428 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
429 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
430 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
431 sa->haliassym = haliassym->syntaxCopy(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
432 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
433 return sa;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
434 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
435
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
436 void AliasDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
437 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
438 //printf("AliasDeclaration::semantic() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
439 if (aliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
440 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
441 if (aliassym->isTemplateInstance())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
442 aliassym->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
443 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
444 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
445 this->inSemantic = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
446
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
447 #if DMDV1 // don't really know why this is here
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
448 if (storage_class & STCconst)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
449 error("cannot be const");
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
450 #endif
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
451
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
452 storage_class |= sc->stc & STCdeprecated;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
453
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
454 // Given:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
455 // alias foo.bar.abc def;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
456 // it is not knowable from the syntax whether this is an alias
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
457 // for a type or an alias for a symbol. It is up to the semantic()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
458 // pass to distinguish.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
459 // If it is a type, then type is set and getType() will return that
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
460 // type. If it is a symbol, then aliassym is set and type is NULL -
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
461 // toAlias() will return aliasssym.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
462
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
463 Dsymbol *s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
464 Type *t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
465 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
466
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
467 /* This section is needed because resolve() will:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
468 * const x = 3;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
469 * alias x y;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
470 * try to alias y to 3.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
471 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
472 s = type->toDsymbol(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
473 if (s
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
474 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
475 ` && ((s->getType() && type->equals(s->getType())) || s->isEnumMember())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
476 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
477 )
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
478 goto L2; // it's a symbolic alias
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
479
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
480 #if DMDV2
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
481 type = type->addStorageClass(storage_class);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
482 if (storage_class & (STCref | STCnothrow | STCpure))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
483 { // For 'ref' to be attached to function types, and picked
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
484 // up by Type::resolve(), it has to go into sc.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
485 sc = sc->push();
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
486 sc->stc |= storage_class & (STCref | STCnothrow | STCpure | STCshared);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
487 type->resolve(loc, sc, &e, &t, &s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
488 sc = sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
489 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
490 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
491 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
492 type->resolve(loc, sc, &e, &t, &s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
493 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
494 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
495 goto L2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
496 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
497 else if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
498 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
499 // Try to convert Expression to Dsymbol
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
500 if (e->op == TOKvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
501 { s = ((VarExp *)e)->var;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
502 goto L2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
503 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
504 else if (e->op == TOKfunction)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
505 { s = ((FuncExp *)e)->fd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
506 goto L2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
507 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
508 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
509 { error("cannot alias an expression %s", e->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
510 t = e->type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
511 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
512 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
513 else if (t)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
514 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
515 type = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
516 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
517 if (overnext)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
518 ScopeDsymbol::multiplyDefined(0, this, overnext);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
519 this->inSemantic = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
520 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
521
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
522 L2:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
523 //printf("alias is a symbol %s %s\n", s->kind(), s->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
524 type = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
525 VarDeclaration *v = s->isVarDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
526 if (v && v->linkage == LINKdefault)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
527 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
528 error("forward reference of %s", v->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
529 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
530 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
531 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
532 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
533 FuncDeclaration *f = s->toAlias()->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
534 if (f)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
535 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
536 if (overnext)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
537 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
538 FuncAliasDeclaration *fa = new FuncAliasDeclaration(f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
539 fa->importprot = importprot;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
540 if (!fa->overloadInsert(overnext))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
541 ScopeDsymbol::multiplyDefined(0, f, overnext);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
542 overnext = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
543 s = fa;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
544 s->parent = sc->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
545 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
546 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
547 if (overnext)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
548 ScopeDsymbol::multiplyDefined(0, s, overnext);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
549 if (s == this)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
550 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
551 assert(global.errors);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
552 s = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
553 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
554 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
555 if (!aliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
556 aliassym = s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
557 this->inSemantic = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
558 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
559
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
560 int AliasDeclaration::overloadInsert(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
561 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
562 /* Don't know yet what the aliased symbol is, so assume it can
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
563 * be overloaded and check later for correctness.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
564 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
565
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
566 //printf("AliasDeclaration::overloadInsert('%s')\n", s->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
567 if (overnext == NULL)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
568 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
569 if (s == this)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
570 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
571 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
572 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
573 overnext = s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
574 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
575 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
576 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
577 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
578 return overnext->overloadInsert(s);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
579 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
580 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
581
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
582 const char *AliasDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
583 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
584 return "alias";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
585 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
586
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
587 Type *AliasDeclaration::getType()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
588 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
589 //printf("AliasDeclaration::getType() %s\n", type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
590 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
591 if (!type->deco && scope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
592 semantic(scope);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
593 if (type && !type->deco)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
594 error("forward reference to alias %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
595 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
596 return type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
597 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
598
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
599 Dsymbol *AliasDeclaration::toAlias()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
600 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
601 //printf("AliasDeclaration::toAlias('%s', this = %p, aliassym = %p, kind = '%s')\n", toChars(), this, aliassym, aliassym ? aliassym->kind() : "");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
602 assert(this != aliassym);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
603 //static int count; if (++count == 75) exit(0); //*(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
604 if (inSemantic)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
605 { error("recursive alias declaration");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
606 aliassym = new TypedefDeclaration(loc, ident, Type::terror, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
607 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
608 Dsymbol *s = aliassym ? aliassym->toAlias() : this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
609 return s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
610 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
611
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
612 void AliasDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
613 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
614 buf->writestring("alias ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
615 #if 0 && _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
616 if (hgs->hdrgen)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
617 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
618 if (haliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
619 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
620 buf->writestring(haliassym->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
621 buf->writeByte(' ');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
622 buf->writestring(ident->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
623 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
624 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
625 htype->toCBuffer(buf, ident, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
626 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
627 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
628 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
629 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
630 if (aliassym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
631 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
632 buf->writestring(aliassym->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
633 buf->writeByte(' ');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
634 buf->writestring(ident->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
635 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
636 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
637 type->toCBuffer(buf, ident, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
638 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
639 buf->writeByte(';');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
640 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
641 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
642
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
643 /********************************* VarDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
644
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
645 VarDeclaration::VarDeclaration(Loc loc, Type *type, Identifier *id, Initializer *init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
646 : Declaration(id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
647 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
648 //printf("VarDeclaration('%s')\n", id->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
649 #ifdef DEBUG
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
650 if (!type && !init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
651 { printf("VarDeclaration('%s')\n", id->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
652 //*(char*)0=0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
653 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
654 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
655 assert(type || init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
656 this->type = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
657 this->init = init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
658 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
659 this->htype = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
660 this->hinit = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
661 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
662 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
663 offset = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
664 noscope = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
665 #if DMDV1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
666 nestedref = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
667 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
668 ctorinit = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
669 aliassym = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
670 onstack = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
671 canassign = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
672 value = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
673
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
674 #if IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
675 aggrIndex = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
676
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
677 // LDC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
678 anonDecl = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
679 offset2 = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
680
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
681 nakedUse = false;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
682
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
683 availableExternally = true; // assume this unless proven otherwise
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
684 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
685 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
686
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
687 Dsymbol *VarDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
688 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
689 //printf("VarDeclaration::syntaxCopy(%s)\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
690
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
691 VarDeclaration *sv;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
692 if (s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
693 { sv = (VarDeclaration *)s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
694 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
695 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
696 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
697 Initializer *init = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
698 if (this->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
699 { init = this->init->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
700 //init->isExpInitializer()->exp->print();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
701 //init->isExpInitializer()->exp->dump(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
702 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
703
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
704 sv = new VarDeclaration(loc, type ? type->syntaxCopy() : NULL, ident, init);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
705 sv->storage_class = storage_class;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
706 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
707 #ifdef _DH
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
708 // Syntax copy for header file
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
709 if (!htype) // Don't overwrite original
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
710 { if (type) // Make copy for both old and new instances
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
711 { htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
712 sv->htype = type->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
713 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
714 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
715 else // Make copy of original for new instance
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
716 sv->htype = htype->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
717 if (!hinit)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
718 { if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
719 { hinit = init->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
720 sv->hinit = init->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
721 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
722 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
723 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
724 sv->hinit = hinit->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
725 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
726 return sv;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
727 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
728
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
729 void VarDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
730 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
731 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
732 printf("VarDeclaration::semantic('%s', parent = '%s')\n", toChars(), sc->parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
733 printf(" type = %s\n", type ? type->toChars() : "null");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
734 printf(" stc = x%x\n", sc->stc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
735 printf(" storage_class = x%x\n", storage_class);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
736 printf("linkage = %d\n", sc->linkage);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
737 //if (strcmp(toChars(), "mul") == 0) halt();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
738 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
739
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
740 storage_class |= sc->stc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
741 if (storage_class & STCextern && init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
742 error("extern symbols cannot have initializers");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
743
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
744 /* If auto type inference, do the inference
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
745 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
746 int inferred = 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
747 if (!type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
748 { inuse++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
749 type = init->inferType(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
750 inuse--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
751 inferred = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
752
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
753 /* This is a kludge to support the existing syntax for RAII
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
754 * declarations.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
755 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
756 storage_class &= ~STCauto;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
757 originalType = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
758 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
759 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
760 { if (!originalType)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
761 originalType = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
762 type = type->semantic(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
763 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
764 //printf(" semantic type = %s\n", type ? type->toChars() : "null");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
765
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
766 type->checkDeprecated(loc, sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
767 linkage = sc->linkage;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
768 this->parent = sc->parent;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
769 //printf("this = %p, parent = %p, '%s'\n", this, parent, parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
770 protection = sc->protection;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
771 //printf("sc->stc = %x\n", sc->stc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
772 //printf("storage_class = x%x\n", storage_class);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
773
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
774 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
775 if (storage_class & STCgshared && global.params.safe && !sc->module->safe)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
776 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
777 error("__gshared not allowed in safe mode; use shared");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
778 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
779 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
780
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
781 Dsymbol *parent = toParent();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
782 FuncDeclaration *fd = parent->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
783
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
784 Type *tb = type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
785 if (tb->ty == Tvoid && !(storage_class & STClazy))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
786 { error("voids have no value");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
787 type = Type::terror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
788 tb = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
789 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
790 if (tb->ty == Tfunction)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
791 { error("cannot be declared to be a function");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
792 type = Type::terror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
793 tb = type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
794 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
795 if (tb->ty == Tstruct)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
796 { TypeStruct *ts = (TypeStruct *)tb;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
797
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
798 if (!ts->sym->members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
799 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
800 error("no definition of struct %s", ts->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
801 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
802 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
803 if ((storage_class & STCauto) && !inferred)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
804 error("both auto and explicit type given");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
805
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
806 if (tb->ty == Ttuple)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
807 { /* Instead, declare variables for each of the tuple elements
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
808 * and add those.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
809 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
810 TypeTuple *tt = (TypeTuple *)tb;
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
811 size_t nelems = Parameter::dim(tt->arguments);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
812 Objects *exps = new Objects();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
813 exps->setDim(nelems);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
814 Expression *ie = init ? init->toExpression() : NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
815
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
816 for (size_t i = 0; i < nelems; i++)
1607
207a8a438dea Merge DMD r253: refactor: Argument => Parameter
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
817 { Parameter *arg = Parameter::getNth(tt->arguments, i);
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
818
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
819 OutBuffer buf;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
820 buf.printf("_%s_field_%zu", ident->toChars(), i);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
821 buf.writeByte(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
822 char *name = (char *)buf.extractData();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
823 Identifier *id = new Identifier(name, TOKidentifier);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
824
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
825 Expression *einit = ie;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
826 if (ie && ie->op == TOKtuple)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
827 { einit = (Expression *)((TupleExp *)ie)->exps->data[i];
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
828 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
829 Initializer *ti = init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
830 if (einit)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
831 { ti = new ExpInitializer(einit->loc, einit);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
832 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
833
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
834 VarDeclaration *v = new VarDeclaration(loc, arg->type, id, ti);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
835 //printf("declaring field %s of type %s\n", v->toChars(), v->type->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
836 v->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
837
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
838 /*
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
839 // removed for LDC since TupleDeclaration::toObj already creates the fields;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
840 // adding them to the scope again leads to duplicates
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
841 if (sc->scopesym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
842 { //printf("adding %s to %s\n", v->toChars(), sc->scopesym->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
843 if (sc->scopesym->members)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
844 sc->scopesym->members->push(v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
845 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
846 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
847 Expression *e = new DsymbolExp(loc, v);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
848 exps->data[i] = e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
849 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
850 TupleDeclaration *v2 = new TupleDeclaration(loc, ident, exps);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
851 v2->isexp = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
852 aliassym = v2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
853 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
854 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
855
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
856 if (storage_class & STCconst && !init && !fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
857 // Initialize by constructor only
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
858 storage_class = (storage_class & ~STCconst) | STCctorinit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
859
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
860 if (isConst())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
861 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
862 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
863 else if (isStatic())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
864 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
865 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
866 else if (isSynchronized())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
867 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
868 error("variable %s cannot be synchronized", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
869 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
870 else if (isOverride())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
871 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
872 error("override cannot be applied to variable");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
873 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
874 else if (isAbstract())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
875 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
876 error("abstract cannot be applied to variable");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
877 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
878 else if (storage_class & STCtemplateparameter)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
879 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
880 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
881 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
882 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
883 AggregateDeclaration *aad = sc->anonAgg;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
884 if (!aad)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
885 aad = parent->isAggregateDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
886 if (aad)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
887 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
888 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
889 assert(!(storage_class & (STCextern | STCstatic | STCtls | STCgshared)));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
890
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
891 if (storage_class & (STCconst | STCimmutable) && init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
892 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
893 if (!type->toBasetype()->isTypeBasic())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
894 storage_class |= STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
895 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
896 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
897 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
898 aad->addField(sc, this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
899 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
900
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
901 InterfaceDeclaration *id = parent->isInterfaceDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
902 if (id)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
903 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
904 error("field not allowed in interface");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
905 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
906
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
907 /* Templates cannot add fields to aggregates
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
908 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
909 TemplateInstance *ti = parent->isTemplateInstance();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
910 if (ti)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
911 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
912 // Take care of nested templates
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
913 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
914 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
915 TemplateInstance *ti2 = ti->tempdecl->parent->isTemplateInstance();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
916 if (!ti2)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
917 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
918 ti = ti2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
919 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
920
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
921 // If it's a member template
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
922 AggregateDeclaration *ad = ti->tempdecl->isMember();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
923 if (ad && storage_class != STCundefined)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
924 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
925 error("cannot use template to add field to aggregate '%s'", ad->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
926 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
927 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
928 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
929
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
930 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
931 if ((storage_class & (STCref | STCparameter | STCforeach)) == STCref &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
932 ident != Id::This)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
933 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
934 error("only parameters or foreach declarations can be ref");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
935 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
936 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
937
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
938 if (type->isscope() && !noscope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
939 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
940 if (storage_class & (STCfield | STCout | STCref | STCstatic) || !fd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
941 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
942 error("globals, statics, fields, ref and out parameters cannot be scope");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
943 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
944
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
945 if (!(storage_class & STCscope))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
946 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
947 if (!(storage_class & STCparameter) && ident != Id::withSym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
948 error("reference to scope class must be scope");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
949 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
950 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
951
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
952 enum TOK op = TOKconstruct;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
953 if (!init && !sc->inunion && !isStatic() && !isConst() && fd &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
954 !(storage_class & (STCfield | STCin | STCforeach)) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
955 type->size() != 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
956 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
957 // Provide a default initializer
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
958 //printf("Providing default initializer for '%s'\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
959 if (type->ty == Tstruct &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
960 ((TypeStruct *)type)->sym->zeroInit == 1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
961 { /* If a struct is all zeros, as a special case
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
962 * set it's initializer to the integer 0.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
963 * In AssignExp::toElem(), we check for this and issue
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
964 * a memset() to initialize the struct.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
965 * Must do same check in interpreter.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
966 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
967 Expression *e = new IntegerExp(loc, 0, Type::tint32);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
968 Expression *e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
969 e1 = new VarExp(loc, this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
970 e = new AssignExp(loc, e1, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
971 e->op = TOKconstruct;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
972 e->type = e1->type; // don't type check this, it would fail
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
973 init = new ExpInitializer(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
974 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
975 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
976 else if (type->ty == Ttypedef)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
977 { TypeTypedef *td = (TypeTypedef *)type;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
978 if (td->sym->init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
979 { init = td->sym->init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
980 ExpInitializer *ie = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
981 if (ie)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
982 // Make copy so we can modify it
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
983 init = new ExpInitializer(ie->loc, ie->exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
984 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
985 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
986 init = getExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
987 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
988 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
989 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
990 init = getExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
991 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
992 // Default initializer is always a blit
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
993 op = TOKblit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
994 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
995
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
996 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
997 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
998 sc = sc->push();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
999 sc->stc &= ~(STC_TYPECTOR | STCpure | STCnothrow | STCref);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1000
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1001 ArrayInitializer *ai = init->isArrayInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1002 if (ai && tb->ty == Taarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1003 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1004 init = ai->toAssocArrayInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1005 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1006
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1007 StructInitializer *si = init->isStructInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1008 ExpInitializer *ei = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1009
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1010 // See if initializer is a NewExp that can be allocated on the stack
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1011 if (ei && isScope() && ei->exp->op == TOKnew)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1012 { NewExp *ne = (NewExp *)ei->exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1013 if (!(ne->newargs && ne->newargs->dim))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1014 { ne->onstack = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1015 onstack = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1016 if (type->isBaseOf(ne->newtype->semantic(loc, sc), NULL))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1017 onstack = 2;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1018 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1019 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1020
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1021 // If inside function, there is no semantic3() call
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1022 if (sc->func)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1023 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1024 // If local variable, use AssignExp to handle all the various
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1025 // possibilities.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1026 if (fd && !isStatic() && !isConst() && !init->isVoidInitializer())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1027 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1028 //printf("fd = '%s', var = '%s'\n", fd->toChars(), toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1029 if (!ei)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1030 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1031 Expression *e = init->toExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1032 if (!e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1033 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1034 init = init->semantic(sc, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1035 e = init->toExpression();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1036 if (!e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1037 { error("is not a static and cannot have static initializer");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1038 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1039 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1040 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1041 ei = new ExpInitializer(init->loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1042 init = ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1043 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1044
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1045 Expression *e1 = new VarExp(loc, this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1046
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1047 Type *t = type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1048 if (t->ty == Tsarray && !(storage_class & (STCref | STCout)))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1049 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1050 ei->exp = ei->exp->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1051 if (!ei->exp->implicitConvTo(type))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1052 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1053 int dim = ((TypeSArray *)t)->dim->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1054 // If multidimensional static array, treat as one large array
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1055 while (1)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1056 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1057 t = t->nextOf()->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1058 if (t->ty != Tsarray)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1059 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1060 dim *= ((TypeSArray *)t)->dim->toInteger();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1061 e1->type = new TypeSArray(t->nextOf(), new IntegerExp(0, dim, Type::tindex));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1062 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1063 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1064 e1 = new SliceExp(loc, e1, NULL, NULL);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1065 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1066 else if (t->ty == Tstruct)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1067 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1068 ei->exp = ei->exp->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1069 ei->exp = resolveProperties(sc, ei->exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1070 StructDeclaration *sd = ((TypeStruct *)t)->sym;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1071 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1072 /* Look to see if initializer is a call to the constructor
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1073 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1074 if (sd->ctor && // there are constructors
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1075 ei->exp->type->ty == Tstruct && // rvalue is the same struct
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1076 ((TypeStruct *)ei->exp->type)->sym == sd &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1077 ei->exp->op == TOKstar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1078 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1079 /* Look for form of constructor call which is:
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1080 * *__ctmp.ctor(arguments...)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1081 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1082 PtrExp *pe = (PtrExp *)ei->exp;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1083 if (pe->e1->op == TOKcall)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1084 { CallExp *ce = (CallExp *)pe->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1085 if (ce->e1->op == TOKdotvar)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1086 { DotVarExp *dve = (DotVarExp *)ce->e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1087 if (dve->var->isCtorDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1088 { /* It's a constructor call, currently constructing
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1089 * a temporary __ctmp.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1090 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1091 /* Before calling the constructor, initialize
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1092 * variable with a bit copy of the default
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1093 * initializer
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1094 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1095 Expression *e = new AssignExp(loc, new VarExp(loc, this), t->defaultInit(loc));
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1096 e->op = TOKblit;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1097 e->type = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1098 ei->exp = new CommaExp(loc, e, ei->exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1099
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1100 /* Replace __ctmp being constructed with e1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1101 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1102 dve->e1 = e1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1103 return;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1104 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1105 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1106 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1107 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1108 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1109 if (!ei->exp->implicitConvTo(type))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1110 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1111 /* Look for opCall
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1112 * See bugzilla 2702 for more discussion
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1113 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1114 Type *ti = ei->exp->type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1115 // Don't cast away invariant or mutability in initializer
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1116 if (search_function(sd, Id::call) &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1117 /* Initializing with the same type is done differently
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1118 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1119 !(ti->ty == Tstruct && t->toDsymbol(sc) == ti->toDsymbol(sc)))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1120 { // Rewrite as e1.call(arguments)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1121 Expression * eCall = new DotIdExp(loc, e1, Id::call);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1122 ei->exp = new CallExp(loc, eCall, ei->exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1123 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1124 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1125 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1126 ei->exp = new AssignExp(loc, e1, ei->exp);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1127 ei->exp->op = TOKconstruct;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1128 canassign++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1129 ei->exp = ei->exp->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1130 canassign--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1131 ei->exp->optimize(WANTvalue);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1132 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1133 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1134 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1135 init = init->semantic(sc, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1136 if (fd && isConst() && !isStatic())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1137 { // Make it static
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1138 storage_class |= STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1139 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1140 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1141 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1142 else if (isConst() || isFinal() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1143 parent->isAggregateDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1144 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1145 /* Because we may need the results of a const declaration in a
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1146 * subsequent type, such as an array dimension, before semantic2()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1147 * gets ordinarily run, try to run semantic2() now.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1148 * Ignore failure.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1149 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1150
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1151 if (!global.errors && !inferred)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1152 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1153 unsigned errors = global.errors;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1154 global.gag++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1155 //printf("+gag\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1156 Expression *e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1157 Initializer *i2 = init;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1158 inuse++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1159 if (ei)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1160 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1161 e = ei->exp->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1162 e = e->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1163 e = e->implicitCastTo(sc, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1164 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1165 else if (si || ai)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1166 { i2 = init->syntaxCopy();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1167 i2 = i2->semantic(sc, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1168 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1169 inuse--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1170 global.gag--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1171 //printf("-gag\n");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1172 if (errors != global.errors) // if errors happened
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1173 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1174 if (global.gag == 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1175 global.errors = errors; // act as if nothing happened
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1176 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1177 /* Save scope for later use, to try again
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1178 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1179 scope = new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1180 scope->setNoFree();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1181 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1182 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1183 else if (ei)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1184 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1185 e = e->optimize(WANTvalue | WANTinterpret);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1186 if (e->op == TOKint64 || e->op == TOKstring || e->op == TOKfloat64)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1187 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1188 ei->exp = e; // no errors, keep result
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1189 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1190 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1191 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1192 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1193 /* Save scope for later use, to try again
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1194 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1195 scope = new Scope(*sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1196 scope->setNoFree();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1197 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1198 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1199 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1200 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1201 init = i2; // no errors, keep result
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1202 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1203 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1204 sc = sc->pop();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1205 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1206 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1207
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1208 ExpInitializer *VarDeclaration::getExpInitializer()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1209 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1210 ExpInitializer *ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1211
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1212 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1213 ei = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1214 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1215 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1216 Expression *e = type->defaultInit(loc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1217 if (e)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1218 ei = new ExpInitializer(loc, e);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1219 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1220 ei = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1221 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1222 return ei;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1223 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1224
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1225 void VarDeclaration::semantic2(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1226 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1227 //printf("VarDeclaration::semantic2('%s')\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1228 if (init && !toParent()->isFuncDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1229 { inuse++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1230 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1231 ExpInitializer *ei = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1232 if (ei)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1233 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1234 ei->exp->dump(0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1235 printf("type = %p\n", ei->exp->type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1236 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1237 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1238 init = init->semantic(sc, type);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1239 inuse--;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1240 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1241 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1242
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1243 void VarDeclaration::semantic3(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1244 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1245 // LDC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1246 if (!global.params.useAvailableExternally)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1247 availableExternally = false;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1248
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1249 // Preserve call chain
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1250 Declaration::semantic3(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1251 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1252
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1253 const char *VarDeclaration::kind()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1254 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1255 return "variable";
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1256 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1257
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1258 Dsymbol *VarDeclaration::toAlias()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1259 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1260 //printf("VarDeclaration::toAlias('%s', this = %p, aliassym = %p)\n", toChars(), this, aliassym);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1261 assert(this != aliassym);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1262 Dsymbol *s = aliassym ? aliassym->toAlias() : this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1263 return s;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1264 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1265
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1266 void VarDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1267 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1268 StorageClassDeclaration::stcToCBuffer(buf, storage_class);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1269
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1270 /* If changing, be sure and fix CompoundDeclarationStatement::toCBuffer()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1271 * too.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1272 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1273 if (type)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1274 type->toCBuffer(buf, ident, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1275 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1276 buf->writestring(ident->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1277 if (init)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1278 { buf->writestring(" = ");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1279 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1280 ExpInitializer *ie = init->isExpInitializer();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1281 if (ie && (ie->exp->op == TOKconstruct || ie->exp->op == TOKblit))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1282 ((AssignExp *)ie->exp)->e2->toCBuffer(buf, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1283 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1284 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1285 init->toCBuffer(buf, hgs);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1286 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1287 buf->writeByte(';');
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1288 buf->writenl();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1289 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1290
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1291 int VarDeclaration::needThis()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1292 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1293 //printf("VarDeclaration::needThis(%s, x%x)\n", toChars(), storage_class);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1294 return storage_class & STCfield;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1295 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1296
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1297 int VarDeclaration::isImportedSymbol()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1298 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1299 if (protection == PROTexport && !init && (isStatic() || isConst() || parent->isModule()))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1300 return TRUE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1301 return FALSE;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1302 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1303
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1304 void VarDeclaration::checkCtorConstInit()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1305 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1306 if (ctorinit == 0 && isCtorinit() && !(storage_class & STCfield))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1307 error("missing initializer in static constructor for const variable");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1308 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1309
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1310 /************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1311 * Check to see if this variable is actually in an enclosing function
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1312 * rather than the current one.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1313 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1314
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1315 void VarDeclaration::checkNestedReference(Scope *sc, Loc loc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1316 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1317 //printf("VarDeclaration::checkNestedReference() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1318 if (parent && !isDataseg() && parent != sc->parent)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1319 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1320 // The function that this variable is in
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1321 FuncDeclaration *fdv = toParent()->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1322 // The current function
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1323 FuncDeclaration *fdthis = sc->parent->isFuncDeclaration();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1324
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1325 if (fdv && fdthis)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1326 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1327 if (loc.filename)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1328 fdthis->getLevel(loc, fdv);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1329 nestedref = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1330 fdv->nestedFrameRef = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1331 #if IN_LLVM
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1332 #if DMDV1
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1333 fdv->nestedVars.insert(this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1334 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1335 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1336 //printf("var %s in function %s is nested ref\n", toChars(), fdv->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1337 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1338 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1339 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1340
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1341 /*******************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1342 * Does symbol go into data segment?
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1343 * Includes extern variables.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1344 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1345
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1346 int VarDeclaration::isDataseg()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1347 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1348 #if 0
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1349 printf("VarDeclaration::isDataseg(%p, '%s')\n", this, toChars());
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1350 printf("%llx, %p, %p\n", storage_class & (STCstatic | STCconst), parent->isModule(), parent->isTemplateInstance());
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1351 printf("parent = '%s'\n", parent->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1352 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1353 Dsymbol *parent = this->toParent();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1354 if (!parent && !(storage_class & (STCstatic | STCconst)))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1355 { error("forward referenced");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1356 type = Type::terror;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1357 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1358 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1359 return (storage_class & (STCstatic | STCconst) ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1360 parent->isModule() ||
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1361 parent->isTemplateInstance());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1362 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1363
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1364 /************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1365 * Does symbol go into thread local storage?
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1366 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1367
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1368 int VarDeclaration::isThreadlocal()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1369 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1370 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1371 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1372
1621
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1373 /********************************************
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1374 * Can variable be read and written by CTFE?
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1375 */
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1376
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1377 int VarDeclaration::isCTFE()
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1378 {
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1379 //printf("VarDeclaration::isCTFE(%p, '%s')\n", this, toChars());
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1380 //printf("%llx\n", storage_class);
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1381 return (storage_class & STCctfe) || !isDataseg();
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1382 }
fb2e6707ad17 Merge DMD r314+r315: bugzilla 2029 Typesafe variadic functions don't...
Leandro Lucarella <llucax@gmail.com>
parents: 1619
diff changeset
1383
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1384 int VarDeclaration::hasPointers()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1385 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1386 //printf("VarDeclaration::hasPointers() %s, ty = %d\n", toChars(), type->ty);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1387 return (!isDataseg() && type->hasPointers());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1388 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1389
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1390 int VarDeclaration::isSameAsInitializer()
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1391 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1392 if (init && init->isExpInitializer() &&
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1393 init->isExpInitializer()->exp->op == TOKstructliteral)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1394 return 0;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1395 return isConst();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1396 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1397
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1398 /******************************************
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1399 * If a variable has an scope destructor call, return call for it.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1400 * Otherwise, return NULL.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1401 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1402
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1403 Expression *VarDeclaration::callScopeDtor(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1404 { Expression *e = NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1405
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1406 //printf("VarDeclaration::callScopeDtor() %s\n", toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1407 if (storage_class & STCscope && !noscope)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1408 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1409 for (ClassDeclaration *cd = type->isClassHandle();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1410 cd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1411 cd = cd->baseClass)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1412 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1413 /* We can do better if there's a way with onstack
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1414 * classes to determine if there's no way the monitor
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1415 * could be set.
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1416 */
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1417 //if (cd->isInterfaceDeclaration())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1418 //error("interface %s cannot be scope", cd->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1419 if (1 || onstack || cd->dtors.dim) // if any destructors
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1420 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1421 // delete this;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1422 Expression *ec;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1423
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1424 ec = new VarExp(loc, this);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1425 e = new DeleteExp(loc, ec);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1426 e->type = Type::tvoid;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1427 break;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1428 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1429 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1430 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1431 return e;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1432 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1433
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1434
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1435 /********************************* ClassInfoDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1436
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1437 ClassInfoDeclaration::ClassInfoDeclaration(ClassDeclaration *cd)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1438 : VarDeclaration(0, ClassDeclaration::classinfo->type, cd->ident, NULL)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1439 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1440 this->cd = cd;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1441 storage_class = STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1442 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1443
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1444 Dsymbol *ClassInfoDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1445 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1446 assert(0); // should never be produced by syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1447 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1448 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1449
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1450 void ClassInfoDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1451 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1452 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1453
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1454 /********************************* ModuleInfoDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1455
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1456 ModuleInfoDeclaration::ModuleInfoDeclaration(Module *mod)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1457 : VarDeclaration(0, Module::moduleinfo->type, mod->ident, NULL)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1458 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1459 this->mod = mod;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1460 storage_class = STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1461 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1462
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1463 Dsymbol *ModuleInfoDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1464 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1465 assert(0); // should never be produced by syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1466 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1467 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1468
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1469 void ModuleInfoDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1470 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1471 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1472
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1473 /********************************* TypeInfoDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1474
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1475 TypeInfoDeclaration::TypeInfoDeclaration(Type *tinfo, int internal)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1476 : VarDeclaration(0, Type::typeinfo->type, tinfo->getTypeInfoIdent(internal), NULL)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1477 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1478 this->tinfo = tinfo;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1479 storage_class = STCstatic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1480 protection = PROTpublic;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1481 linkage = LINKc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1482 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1483
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1484 Dsymbol *TypeInfoDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1485 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1486 assert(0); // should never be produced by syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1487 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1488 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1489
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1490 void TypeInfoDeclaration::semantic(Scope *sc)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1491 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1492 assert(linkage == LINKc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1493 // LDC
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1494 if (!global.params.useAvailableExternally)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1495 availableExternally = false;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1496 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1497
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1498 /***************************** TypeInfoConstDeclaration **********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1499
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1500 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1501 TypeInfoConstDeclaration::TypeInfoConstDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1502 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1503 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1504 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1505 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1506
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1507 /***************************** TypeInfoInvariantDeclaration **********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1508
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1509 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1510 TypeInfoInvariantDeclaration::TypeInfoInvariantDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1511 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1512 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1513 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1514 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1515
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1516 /***************************** TypeInfoSharedDeclaration **********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1517
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1518 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1519 TypeInfoSharedDeclaration::TypeInfoSharedDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1520 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1521 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1522 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1523 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1524
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1525 /***************************** TypeInfoStructDeclaration **********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1526
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1527 TypeInfoStructDeclaration::TypeInfoStructDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1528 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1529 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1530 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1531
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1532 /***************************** TypeInfoClassDeclaration ***********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1533
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1534 TypeInfoClassDeclaration::TypeInfoClassDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1535 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1536 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1537 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1538
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1539 /***************************** TypeInfoInterfaceDeclaration *******************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1540
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1541 TypeInfoInterfaceDeclaration::TypeInfoInterfaceDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1542 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1543 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1544 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1545
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1546 /***************************** TypeInfoTypedefDeclaration *********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1547
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1548 TypeInfoTypedefDeclaration::TypeInfoTypedefDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1549 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1550 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1551 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1552
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1553 /***************************** TypeInfoPointerDeclaration *********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1554
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1555 TypeInfoPointerDeclaration::TypeInfoPointerDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1556 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1557 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1558 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1559
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1560 /***************************** TypeInfoArrayDeclaration ***********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1561
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1562 TypeInfoArrayDeclaration::TypeInfoArrayDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1563 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1564 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1565 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1566
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1567 /***************************** TypeInfoStaticArrayDeclaration *****************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1568
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1569 TypeInfoStaticArrayDeclaration::TypeInfoStaticArrayDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1570 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1571 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1572 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1573
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1574 /***************************** TypeInfoAssociativeArrayDeclaration ************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1575
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1576 TypeInfoAssociativeArrayDeclaration::TypeInfoAssociativeArrayDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1577 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1578 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1579 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1580
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1581 /***************************** TypeInfoEnumDeclaration ***********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1582
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1583 TypeInfoEnumDeclaration::TypeInfoEnumDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1584 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1585 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1586 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1588 /***************************** TypeInfoFunctionDeclaration ********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1589
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1590 TypeInfoFunctionDeclaration::TypeInfoFunctionDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1591 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1592 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1593 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1594
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1595 /***************************** TypeInfoDelegateDeclaration ********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1596
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1597 TypeInfoDelegateDeclaration::TypeInfoDelegateDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1598 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1599 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1600 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1601
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1602 /***************************** TypeInfoTupleDeclaration **********************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1603
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1604 TypeInfoTupleDeclaration::TypeInfoTupleDeclaration(Type *tinfo)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1605 : TypeInfoDeclaration(tinfo, 0)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1606 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1607 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1608
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1609 /********************************* ThisDeclaration ****************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1610
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1611 // For the "this" parameter to member functions
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1612
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1613 ThisDeclaration::ThisDeclaration(Loc loc, Type *t)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1614 : VarDeclaration(loc, t, Id::This, NULL)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1615 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1616 noscope = 1;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1617 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1618
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1619 Dsymbol *ThisDeclaration::syntaxCopy(Dsymbol *s)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1620 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1621 assert(0); // should never be produced by syntax
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1622 return NULL;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1623 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1624
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1625 /********************** StaticStructInitDeclaration ***************************/
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1626
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1627 StaticStructInitDeclaration::StaticStructInitDeclaration(Loc loc, StructDeclaration *dsym)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1628 : Declaration(new Identifier("", TOKidentifier))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1629 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1630 this->loc = loc;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1631 this->dsym = dsym;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1632 storage_class |= STCconst;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1538
diff changeset
1633 }