annotate dmd/TemplateDeclaration.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents af1bebfd96a4
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.TemplateDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 113
diff changeset
3 import dmd.common;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.ScopeDsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6 import dmd.ArrayTypes;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import dmd.Dsymbol;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import dmd.STC;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9 import dmd.TemplateThisParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import dmd.Global;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
12 import dmd.Identifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
13 import dmd.TypeArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 import dmd.Expression;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 import dmd.Scope;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 import dmd.TypeIdentifier;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 import dmd.TypeDelegate;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 import dmd.IntegerExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 import dmd.TypeSArray;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20 import dmd.StringExp;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 import dmd.TOK;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
22 import dmd.Parameter;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 import dmd.CtorDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 import dmd.TypeFunction;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 import dmd.TY;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 import dmd.OutBuffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27 import dmd.Declaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 import dmd.HdrGenState;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 import dmd.TemplateInstance;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 import dmd.WANT;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 import dmd.FuncDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32 import dmd.TemplateTupleParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 import dmd.MATCH;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 import dmd.Type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 import dmd.Tuple;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 import dmd.TupleDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
37 import dmd.Initializer;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
38 import dmd.Json;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 import dmd.ExpInitializer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 import dmd.TemplateValueParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 import dmd.AliasDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 import dmd.VarDeclaration;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 import dmd.TemplateParameter;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 import dmd.TemplateTypeParameter;
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
45 import dmd.MOD;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 import dmd.expression.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
48
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 import std.stdio;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51 /**************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 * Determine if TemplateDeclaration is variadic.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 TemplateTupleParameter isVariadic(TemplateParameters parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 size_t dim = parameters.dim;
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
58 TemplateTupleParameter tp = null;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
60 if (dim)
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
61 tp = parameters[dim - 1].isTemplateTupleParameter();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
63 return tp;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66 void ObjectToCBuffer(OutBuffer buf, HdrGenState* hgs, Object oarg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 {
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
68 //printf("ObjectToCBuffer()\n");
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
69 Type t = isType(oarg);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
70 Expression e = isExpression(oarg);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
71 Dsymbol s = isDsymbol(oarg);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
72 Tuple v = isTuple(oarg);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
73 if (t)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
74 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 //printf("\tt: %s ty = %d\n", t.toChars(), t.ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 t.toCBuffer(buf, null, hgs);
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
77 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
78 else if (e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 e.toCBuffer(buf, hgs);
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
80 else if (s)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
81 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 string p = s.ident ? s.ident.toChars() : s.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 buf.writestring(p);
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
84 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
85 else if (v)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
86 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87 Objects args = v.objects;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 for (size_t i = 0; i < args.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 buf.writeByte(',');
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
92 Object o = args[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 ObjectToCBuffer(buf, hgs, o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94 }
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
95 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
96 else if (!oarg)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
97 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 buf.writestring("null");
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
99 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
100 else
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
101 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 debug writef("bad Object = %p\n", oarg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 assert(0);
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
104 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107 class TemplateDeclaration : ScopeDsymbol
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 {
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
109 TemplateParameters parameters; // array of TemplateParameter's
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
111 TemplateParameters origParameters; // originals for Ddoc
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
112 Expression constraint;
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
113 Vector!TemplateInstance instances; // array of TemplateInstance's
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
115 TemplateDeclaration overnext; // next overloaded TemplateDeclaration
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
116 TemplateDeclaration overroot; // first in overnext list
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
118 int semanticRun; // 1 semantic() run
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
120 Dsymbol onemember; // if !=NULL then one member of this template
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
122 int literal; // this template declaration is a literal
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
124 this(Loc loc, Identifier id, TemplateParameters parameters, Expression constraint, Dsymbols decldefs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
126 register();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127 super(id);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 printf("TemplateDeclaration(this = %p, id = '%s')\n", this, id.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 if (parameters)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 for (int i = 0; i < parameters.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 TemplateParameter tp = cast(TemplateParameter)parameters.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 //printf("\tparameter[%d] = %p\n", i, tp);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 TemplateTypeParameter ttp = tp.isTemplateTypeParameter();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 if (ttp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 printf("\tparameter[%d] = %s : %s\n", i, tp.ident.toChars(), ttp.specType ? ttp.specType.toChars() : "");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 this.loc = loc;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 this.parameters = parameters;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149 this.origParameters = parameters;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 this.constraint = constraint;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
151 this.members = decldefs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152
128
e6e542f37b94 Some more Array -> Vector conversions
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 126
diff changeset
153 instances = new Vector!TemplateInstance();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
156 override Dsymbol syntaxCopy(Dsymbol)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 {
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
158 //printf("TemplateDeclaration.syntaxCopy()\n");
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
159 TemplateDeclaration td;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
160 TemplateParameters p;
74
7e0d548de9e6 Switch Arrays of Dsymbols to the new templated Vector type
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 72
diff changeset
161 Dsymbols d;
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
162
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
163 p = null;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
164 if (parameters)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
165 {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
166 p = new TemplateParameters();
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
167 p.setDim(parameters.dim);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
168 for (int i = 0; i < p.dim; i++)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
169 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
170 auto tp = parameters[i];
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
171 p[i] = tp.syntaxCopy();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
172 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
173 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
174
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
175 Expression e = null;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
176 if (constraint)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
177 e = constraint.syntaxCopy();
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
178 d = Dsymbol.arraySyntaxCopy(members);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
179 td = new TemplateDeclaration(loc, ident, p, e, d);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
180 return td;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
183 override void semantic(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
184 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 version (LOG) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 printf("TemplateDeclaration.semantic(this = %p, id = '%s')\n", this, ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 if (semanticRun)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 return; // semantic() already run
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 semanticRun = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 if (sc.func)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 version (DMDV1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195 error("cannot declare template at function scope %s", sc.func.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199 if (/*global.params.useArrayBounds &&*/ sc.module_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 // Generate this function as it may be used
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 // when template is instantiated in other modules
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 sc.module_.toModuleArray();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 if (/*global.params.useAssert &&*/ sc.module_)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208 // Generate this function as it may be used
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 // when template is instantiated in other modules
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 sc.module_.toModuleAssert();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213 /* Remember Scope for later instantiations, but make
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 * a copy since attributes can change.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 */
87
b17640f0e4e8 Fixed a bug with a Scope.this(Scope enclosing) being called instead of Scope.clone() method (as a copy ctor replacement)
korDen
parents: 79
diff changeset
216 this.scope_ = sc.clone();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217 this.scope_.setNoFree();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 // Set up scope for parameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 ScopeDsymbol paramsym = new ScopeDsymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 paramsym.parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222 Scope paramscope = sc.push(paramsym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 paramscope.parameterSpecialization = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 paramscope.stc = STCundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 if (!parent)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 parent = sc.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 if (global.params.doDocComments)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 origParameters = new TemplateParameters();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 origParameters.setDim(parameters.dim);
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
233 foreach (size_t i, TemplateParameter tp; parameters)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
235 origParameters[i] = tp.syntaxCopy();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
239 foreach (tp; parameters)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 tp.declareParameter(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
244 foreach (size_t i, TemplateParameter tp; parameters)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 tp.semantic(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 if (i + 1 != parameters.dim && tp.isTemplateTupleParameter())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248 error("template tuple parameter must be last one");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251 paramscope.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 if (members)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 if (Dsymbol.oneMembers(members, &s))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 if (s && s.ident && s.ident.equals(ident))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 onemember = s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261 s.parent = this;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 /* BUG: should check:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 * o no virtual functions or non-static data members of classes
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
271 /**********************************
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
272 * Overload existing TemplateDeclaration 'this' with the new one 's'.
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
273 * Return !=0 if successful; i.e. no conflict.
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
274 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
275 override bool overloadInsert(Dsymbol s)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276 {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
277 TemplateDeclaration *pf;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
278 TemplateDeclaration f;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
279
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
280 version (LOG) {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
281 printf("TemplateDeclaration.overloadInsert('%.*s')\n", s.toChars());
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
282 }
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
283 f = s.isTemplateDeclaration();
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
284 if (!f)
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
285 return false;
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
286
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
287 TemplateDeclaration pthis = this;
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
288 for (pf = &pthis; *pf; pf = &(*pf).overnext)
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
289 {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
290 static if (false) {
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
291 // Conflict if TemplateParameter's match
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
292 // Will get caught anyway later with TemplateInstance, but
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
293 // should check it now.
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
294 if (f.parameters.dim != f2.parameters.dim)
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
295 goto Lcontinue;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
296
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
297 for (int i = 0; i < f.parameters.dim; i++)
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
298 {
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
299 TemplateParameter p1 = cast(TemplateParameter)f.parameters.data[i];
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
300 TemplateParameter p2 = cast(TemplateParameter)f2.parameters.data[i];
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
301
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
302 if (!p1.overloadMatch(p2))
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
303 goto Lcontinue;
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
304 }
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
305
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
306 version (LOG) {
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
307 printf("\tfalse: conflict\n");
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
308 }
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
309 return false;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
310
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
311 Lcontinue:
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
312 ;
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
313 }
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
314 }
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
315
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
316 f.overroot = this;
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
317 *pf = f;
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
318 version (LOG) {
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
319 printf("\ttrue: no conflict\n");
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
320 }
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
321
8
d42cd5917df4 wysiwyg strings, alias this, templates, TypeSlice implementation
dkoroskin <>
parents: 0
diff changeset
322 return true;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
325 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 {
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
327 static if (false) // Should handle template functions
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
328 {
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
329 if (onemember && onemember.isFuncDeclaration())
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
330 buf.writestring("foo ");
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
331 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
332 buf.writestring(kind());
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
333 buf.writeByte(' ');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
334 buf.writestring(ident.toChars());
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
335 buf.writeByte('(');
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
336 foreach (size_t i, TemplateParameter tp; parameters)
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
337 {
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
338 if (hgs.ddoc)
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
339 tp = origParameters[i];
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
340 if (i)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
341 buf.writeByte(',');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
342 tp.toCBuffer(buf, hgs);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
343 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
344 buf.writeByte(')');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
345 version(DMDV2)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
346 {
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
347 if (constraint)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
348 { buf.writestring(" if (");
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
349 constraint.toCBuffer(buf, hgs);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
350 buf.writeByte(')');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
351 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
352 }
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
353
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
354 if (hgs.hdrgen)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
355 {
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
356 hgs.tpltMember++;
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
357 buf.writenl();
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
358 buf.writebyte('{');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
359 buf.writenl();
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
360 foreach (Dsymbol s; members)
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
361 s.toCBuffer(buf, hgs);
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
362
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
363 buf.writebyte('}');
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
364 buf.writenl();
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
365 hgs.tpltMember--;
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
366 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
369 override void toJsonBuffer(OutBuffer buf)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
370 {
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
371 //writef("TemplateDeclaration.toJsonBuffer()\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
372
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
373 buf.writestring("{\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
374
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
375 JsonProperty(buf, Pname, toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
376 JsonProperty(buf, Pkind, kind());
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
377 if (comment)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
378 JsonProperty(buf, Pcomment, comment);
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
379
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
380 if (loc.linnum)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
381 JsonProperty(buf, Pline, loc.linnum);
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
382
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
383 JsonString(buf, Pmembers);
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
384 buf.writestring(" : [\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
385 size_t offset = buf.offset;
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
386 foreach (Dsymbol s; members)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
387 {
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
388 if (offset != buf.offset)
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
389 { buf.writestring(",\n");
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
390 offset = buf.offset;
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
391 }
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
392 s.toJsonBuffer(buf);
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
393 }
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
394 JsonRemoveComma(buf);
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
395 buf.writestring("]\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
396
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
397 buf.writestring("}\n");
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
398 }
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
399
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
400 override string kind()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
401 {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
402 return (onemember && onemember.isAggregateDeclaration())
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
403 ? onemember.kind()
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
404 : "template";
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
405 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
406
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
407 override string toChars()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
408 {
49
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
409 OutBuffer buf = new OutBuffer();
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
410 HdrGenState hgs;
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
411
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
412 /// memset(&hgs, 0, hgs.sizeof);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
413 buf.writestring(ident.toChars());
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
414 buf.writeByte('(');
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
415 foreach (size_t i, TemplateParameter tp; parameters)
49
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
416 {
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
417 if (i)
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
418 buf.writeByte(',');
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
419 tp.toCBuffer(buf, &hgs);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
420 }
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
421 buf.writeByte(')');
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
422 version (DMDV2) {
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
423 if (constraint)
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
424 {
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
425 buf.writestring(" if (");
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
426 constraint.toCBuffer(buf, &hgs);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
427 buf.writeByte(')');
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
428 }
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
429 }
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
430 buf.writeByte(0);
0aa7d1437ada AttribDeclaration.oneMember
korDen
parents: 8
diff changeset
431 return buf.extractString();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
432 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
433
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
434 override void emitComment(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
435 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
436 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
437 }
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
438
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
439 // void toDocBuffer(OutBuffer *buf);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
440
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
441 /***************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
442 * Given that ti is an instance of this TemplateDeclaration,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
443 * deduce the types of the parameters to this, and store
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
444 * those deduced types in dedtypes[].
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
445 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
446 * flag 1: don't do semantic() because of dummy types
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
447 * 2: don't change types in matchArg()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
448 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
449 * dedtypes deduced arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
450 * Return match level.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
451 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
452 MATCH matchWithInstance(TemplateInstance ti, Objects dedtypes, int flag)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
453 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
454 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
455 int dedtypes_dim = dedtypes.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
456
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
457 version (LOGM) {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
458 printf("\n+TemplateDeclaration.matchWithInstance(this = %.*s, ti = %.*s, flag = %d)\n", toChars(), ti.toChars(), flag);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
459 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
460
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
461 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
462 printf("dedtypes.dim = %d, parameters.dim = %d\n", dedtypes_dim, parameters.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
463 if (ti.tiargs.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
464 printf("ti.tiargs.dim = %d, [0] = %p\n", ti.tiargs.dim, ti.tiargs.data[0]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
465 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
466 dedtypes.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
467
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
468 int parameters_dim = parameters.dim;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
469 int variadic = isVariadic() !is null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
470
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
471 // If more arguments than parameters, no match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
472 if (ti.tiargs.dim > parameters_dim && !variadic)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
473 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
474 version (LOGM) {
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
475 printf(" no match: more arguments than parameters\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
476 }
50
adf6f7f216ea CondExp.toCBuffer
korDen
parents: 49
diff changeset
477 return MATCHnomatch;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
478 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
479
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
480 assert(dedtypes_dim == parameters_dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
481 assert(dedtypes_dim >= ti.tiargs.dim || variadic);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
482
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
483 // Set up scope for parameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
484 assert(cast(size_t)cast(void*)scope_ > 0x10000);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
485 ScopeDsymbol paramsym = new ScopeDsymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
486 paramsym.parent = scope_.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
487 Scope paramscope = scope_.push(paramsym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
488 paramscope.stc = STCundefined;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
489
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
490 // Attempt type deduction
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
491 m = MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
492 for (int i = 0; i < dedtypes_dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
493 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
494 MATCH m2;
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
495 auto tp = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
496 Declaration sparam;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
497
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
498 //printf("\targument [%d]\n", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
499 version (LOGM) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
500 //printf("\targument [%d] is %s\n", i, oarg ? oarg.toChars() : "null");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
501 TemplateTypeParameter *ttp = tp.isTemplateTypeParameter();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
502 if (ttp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
503 printf("\tparameter[%d] is %s : %s\n", i, tp.ident.toChars(), ttp.specType ? ttp.specType.toChars() : "");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
504 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
505
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
506 version (DMDV1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
507 m2 = tp.matchArg(paramscope, ti.tiargs, i, parameters, dedtypes, &sparam);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
508 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
509 m2 = tp.matchArg(paramscope, ti.tiargs, i, parameters, dedtypes, &sparam, (flag & 2) ? 1 : 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
510 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
511 //printf("\tm2 = %d\n", m2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
512
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
513 if (m2 == MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
514 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
515 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
516 printf("\tmatchArg() for parameter %i failed\n", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
517 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
518 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
519 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
520
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
521 if (m2 < m)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
522 m = m2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
523
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
524 if (!flag)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
525 sparam.semantic(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
526 if (!paramscope.insert(sparam))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
527 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
528 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
529
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
530 if (!flag)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
531 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
532 /* Any parameter left without a type gets the type of
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
533 * its corresponding arg
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
534 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
535 for (int i = 0; i < dedtypes_dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
536 {
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
537 if (!dedtypes[i])
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
538 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
539 assert(i < ti.tiargs.dim);
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
540 dedtypes[i] = ti.tiargs[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
541 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
542 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
543 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
544
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
545 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
546 if (m && constraint && !(flag & 1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
547 { /* Check to see if constraint is satisfied.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
548 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
549 makeParamNamesVisibleInConstraint(paramscope);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
550 Expression e = constraint.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
551 paramscope.flags |= SCOPE.SCOPEstaticif;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
552 e = e.semantic(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
553 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
554 if (e.isBool(true)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
555 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
556 } else if (e.isBool(false))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
557 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
558 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
559 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
560 e.error("constraint %s is not constant or does not evaluate to a bool", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
561 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
562 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
563 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
564
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
565 version (LOGM) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
566 // Print out the results
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
567 printf("--------------------------\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
568 printf("template %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
569 printf("instance %s\n", ti.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
570 if (m)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
571 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
572 for (int i = 0; i < dedtypes_dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
573 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
574 TemplateParameter tp = cast(TemplateParameter)parameters.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
575 Object oarg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
576
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
577 printf(" [%d]", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
578
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
579 if (i < ti.tiargs.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
580 oarg = cast(Object)ti.tiargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
581 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
582 oarg = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
583 tp.print(oarg, cast(Object)dedtypes.data[i]);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
584 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
585 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
586 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
587 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
588 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
589
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
590 version (LOGM) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
591 printf(" match = %d\n", m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
592 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
593 goto Lret;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
594
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
595 Lnomatch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
596 version (LOGM) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
597 printf(" no match\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
598 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
599 m = MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
600
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
601 Lret:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
602 paramscope.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
603 version (LOGM) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
604 printf("-TemplateDeclaration.matchWithInstance(this = %p, ti = %p) = %d\n", this, ti, m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
605 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
606 return m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
607 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
608
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
609 /********************************************
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
610 * Determine partial specialization order of 'this' vs td2.
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
611 * Returns:
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
612 * match this is at least as specialized as td2
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
613 * 0 td2 is more specialized than this
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
614 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
615 MATCH leastAsSpecialized(TemplateDeclaration td2)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
616 {
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
617 /* This works by taking the template parameters to this template
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
618 * declaration and feeding them to td2 as if it were a template
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
619 * instance.
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
620 * If it works, then this template is at least as specialized
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
621 * as td2.
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
622 */
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
623
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
624 scope TemplateInstance ti = new TemplateInstance(Loc(0), ident); // create dummy template instance
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
625 scope Objects dedtypes = new Objects();
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
626
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
627 version (LOG_LEASTAS) {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
628 printf("%s.leastAsSpecialized(%s)\n", toChars(), td2.toChars());
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
629 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
630
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
631 // Set type arguments to dummy template instance to be types
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
632 // generated from the parameters to this template declaration
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
633 ti.tiargs = new Objects();
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
634 ti.tiargs.setDim(parameters.dim);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
635 for (int i = 0; i < ti.tiargs.dim; i++)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
636 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
637 auto tp = parameters[i];
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
638
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
639 auto p = tp.dummyArg();
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
640 if (p)
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
641 ti.tiargs[i] = p;
51
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
642 else
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
643 ti.tiargs.setDim(i);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
644 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
645
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
646 // Temporary Array to hold deduced types
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
647 //dedtypes.setDim(parameters.dim);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
648 dedtypes.setDim(td2.parameters.dim);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
649
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
650 // Attempt a type deduction
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
651 MATCH m = td2.matchWithInstance(ti, dedtypes, 1);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
652 if (m)
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
653 {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
654 /* A non-variadic template is more specialized than a
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
655 * variadic one.
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
656 */
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
657 if (isVariadic() && !td2.isVariadic())
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
658 goto L1;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
659
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
660 version (LOG_LEASTAS) {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
661 printf(" matches %d, so is least as specialized\n", m);
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
662 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
663 return m;
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
664 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
665 L1:
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
666 version (LOG_LEASTAS) {
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
667 printf(" doesn't match, so is not as specialized\n");
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
668 }
b7d29f613539 StaticAssertStatement.syntaxCopy
korDen
parents: 50
diff changeset
669 return MATCHnomatch;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
670 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
671
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
672 /*************************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
673 * Match function arguments against a specific template function.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
674 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
675 * loc instantiation location
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
676 * targsi Expression/Type initial list of template arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
677 * ethis 'this' argument if !null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
678 * fargs arguments to function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
679 * Output:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
680 * dedargs Expression/Type deduced template arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
681 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
682 * match level
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
683 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
684 MATCH deduceFunctionTemplateMatch(Loc loc, Objects targsi, Expression ethis, Expressions fargs, Objects dedargs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
685 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
686 size_t nfparams;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
687 size_t nfargs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
688 size_t nargsi; // array size of targsi
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
689 int fptupindex = -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
690 int tuple_dim = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
691 MATCH match = MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
692 FuncDeclaration fd = onemember.toAlias().isFuncDeclaration();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
693 Parameters fparameters; // function parameter list
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
694 int fvarargs; // function varargs
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
695 scope Objects dedtypes = new Objects(); // for T:T*, the dedargs is the T*, dedtypes is the T
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
696
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
697 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
698 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
699 printf("\nTemplateDeclaration.deduceFunctionTemplateMatch() %s\n", toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
700 for (i = 0; i < fargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
701 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
702 Expression e = cast(Expression)fargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
703 printf("\tfarg[%d] is %s, type is %s\n", i, e.toChars(), e.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
704 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
705 printf("fd = %s\n", fd.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
706 printf("fd.type = %p\n", fd.type);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
707 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
708
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
709 assert(cast(size_t)cast(void*)scope_ > 0x10000);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
710
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
711 dedargs.setDim(parameters.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
712 dedargs.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
713
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
714 dedtypes.setDim(parameters.dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
715 dedtypes.zero();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
716
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
717 // Set up scope for parameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
718 ScopeDsymbol paramsym = new ScopeDsymbol();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
719 paramsym.parent = scope_.parent;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
720 Scope paramscope = scope_.push(paramsym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
721
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
722 TemplateTupleParameter tp = isVariadic();
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
723 int tp_is_declared = 0;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
724
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
725 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
726 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
727 for (i = 0; i < dedargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
728 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
729 printf("\tdedarg[%d] = ", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
730 Object oarg = cast(Object)dedargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
731 if (oarg) printf("%s", oarg.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
732 printf("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
733 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
734 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
735
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
736
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
737 nargsi = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
738 if (targsi)
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
739 {
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
740 // Set initial template arguments
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
741 nargsi = targsi.dim;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
742 size_t n = parameters.dim;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
743 if (tp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
744 n--;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
745 if (nargsi > n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
746 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
747 if (!tp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
748 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
749
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
750 /* The extra initial template arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
751 * now form the tuple argument.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
752 */
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
753 auto t = new Tuple();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
754 assert(parameters.dim);
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
755 dedargs[parameters.dim - 1] = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
756
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
757 tuple_dim = nargsi - n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
758 t.objects.setDim(tuple_dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
759 for (size_t i = 0; i < tuple_dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
760 {
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
761 t.objects[i] = targsi[n + i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
762 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
763 declareParameter(paramscope, tp, t);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
764 tp_is_declared = 1;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
765 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
766 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
767 n = nargsi;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
768
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
769 memcpy(dedargs.ptr, targsi.ptr, n * (*dedargs.ptr).sizeof);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
770
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
771 for (size_t i = 0; i < n; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
772 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
773 assert(i < parameters.dim);
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
774 auto tp2 = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
775 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
776 Declaration sparam = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
777
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
778 m = tp2.matchArg(paramscope, dedargs, i, parameters, dedtypes, &sparam);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
779 //printf("\tdeduceType m = %d\n", m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
780 if (m == MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
781 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
782 if (m < match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
783 match = m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
784
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
785 sparam.semantic(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
786 if (!paramscope.insert(sparam))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
787 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
788 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
789 }
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
790 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
791 {
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
792 for (i = 0; i < dedargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
793 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
794 printf("\tdedarg[%d] = ", i);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
795 Object oarg = cast(Object)dedargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
796 if (oarg) printf("%s", oarg.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
797 printf("\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
798 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
799 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
800
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
801 fparameters = fd.getParameters(&fvarargs);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
802 nfparams = Parameter.dim(fparameters); // number of function parameters
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
803 nfargs = fargs ? fargs.dim : 0; // number of function arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
804
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
805 /* Check for match of function arguments with variadic template
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
806 * parameter, such as:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
807 *
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
808 * template Foo(T, A...) { void Foo(T t, A a); }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
809 * void main() { Foo(1,2,3); }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
810 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
811 if (tp) // if variadic
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
812 {
79
43073c7c7769 updated to 2.035
Trass3r
parents: 74
diff changeset
813 if (nfparams == 0 && nfargs != 0) // if no function parameters
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
814 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
815 if (tp_is_declared)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
816 goto L2;
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
817 auto t = new Tuple();
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
818 //printf("t = %p\n", t);
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
819 dedargs[parameters.dim - 1] = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
820 declareParameter(paramscope, tp, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
821 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
822 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
823 else if (nfargs < nfparams - 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
824 goto L1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
825 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
826 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
827 /* Figure out which of the function parameters matches
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
828 * the tuple template parameter. Do this by matching
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
829 * type identifiers.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
830 * Set the index of this function parameter to fptupindex.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832 for (fptupindex = 0; fptupindex < nfparams; fptupindex++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
833 {
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
834 auto fparam = fparameters[fptupindex];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
835 if (fparam.type.ty != Tident)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
836 continue;
126
1765f3ef917d ClassDeclarations, Arguments -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 121
diff changeset
837 auto tid = cast(TypeIdentifier)fparam.type;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
838 if (!tp.ident.equals(tid.ident) || tid.idents.dim)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
839 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
840
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
841 if (fvarargs) // variadic function doesn't
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
842 goto Lnomatch; // go with variadic template
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
843
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
844 if (tp_is_declared)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
845 goto L2;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
846
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
847 /* The types of the function arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
848 * now form the tuple argument.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
849 */
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
850 auto t = new Tuple();
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
851 dedargs[parameters.dim - 1] = t;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
852
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
853 tuple_dim = nfargs - (nfparams - 1);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
854 t.objects.setDim(tuple_dim);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
855 for (size_t i = 0; i < tuple_dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
856 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 87
diff changeset
857 auto farg = fargs[fptupindex + i];
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
858 t.objects[i] = farg.type;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
859 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
860 declareParameter(paramscope, tp, t);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
861 goto L2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
862 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
863 fptupindex = -1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
864 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
865 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
866
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
867 L1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
868 if (nfparams == nfargs) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
869 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
870 } else if (nfargs > nfparams) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
871 if (fvarargs == 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
872 goto Lnomatch; // too many args, no match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
873 match = MATCHconvert; // match ... with a conversion
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
874 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
875
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
876 L2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
877 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
878 // Match 'ethis' to any TemplateThisParameter's
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
879 if (ethis)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
880 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
881 for (size_t i = 0; i < parameters.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
882 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
883 auto tp2 = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
884 TemplateThisParameter ttp = tp2.isTemplateThisParameter();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
885 if (ttp)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
887 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
888
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
889 Type t = new TypeIdentifier(Loc(0), ttp.ident);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
890 m = ethis.type.deduceType(paramscope, t, parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
891 if (!m)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
892 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
893 if (m < match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
894 match = m; // pick worst match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
895 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
896 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
897 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
898 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
899
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
900 // Loop through the function parameters
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
901 for (size_t i = 0; i < nfparams; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
902 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
903 /* Skip over function parameters which wound up
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
904 * as part of a template tuple parameter.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
905 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
906 if (i == fptupindex)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
907 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
908 if (fptupindex == nfparams - 1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
909 break;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
910 i += tuple_dim - 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
911 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
912 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
913
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
914 auto fparam = Parameter.getNth(fparameters, i);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
915
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
916 if (i >= nfargs) // if not enough arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
917 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
918 if (fparam.defaultArg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
919 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
920 /* Default arguments do not participate in template argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
921 * deduction.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
922 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
923 goto Lmatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
924 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
925 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
926 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
927 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 87
diff changeset
928 auto farg = fargs[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
929 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
930 printf("\tfarg.type = %s\n", farg.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
931 printf("\tfparam.type = %s\n", fparam.type.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
932 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
933 Type argtype = farg.type;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
934
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
935 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
936 /* Allow string literals which are type [] to match with [dim]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
937 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
938 if (farg.op == TOKstring)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
939 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
940 StringExp se = cast(StringExp)farg;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
941 if (!se.committed && argtype.ty == Tarray &&
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
942 fparam.type.toBasetype().ty == Tsarray)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
943 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
944 argtype = new TypeSArray(argtype.nextOf(), new IntegerExp(se.loc, se.len, Type.tindex));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
945 argtype = argtype.semantic(se.loc, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
946 argtype = argtype.invariantOf();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
947 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
948 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
949 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
950
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
951 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
952 m = argtype.deduceType(paramscope, fparam.type, parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
953 //printf("\tdeduceType m = %d\n", m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
954
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
955 /* If no match, see if there's a conversion to a delegate
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
956 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
957 if (!m && fparam.type.toBasetype().ty == Tdelegate)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
958 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
959 TypeDelegate td = cast(TypeDelegate)fparam.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
960 TypeFunction tf = cast(TypeFunction)td.next;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
961
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
962 if (!tf.varargs && Parameter.dim(tf.parameters) == 0)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
963 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 m = farg.type.deduceType(paramscope, tf.next, parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965 if (!m && tf.next.toBasetype().ty == Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
966 m = MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
968 //printf("\tm2 = %d\n", m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
969 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
970
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
971 if (m)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
972 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
973 if (m < match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
974 match = m; // pick worst match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
975 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
976 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
977 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
978
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
979 /* The following code for variadic arguments closely
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
980 * matches TypeFunction.callMatch()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
981 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
982 if (!(fvarargs == 2 && i + 1 == nfparams))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
983 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
984
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
985 /* Check for match with function parameter T...
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
986 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
987 Type tb = fparam.type.toBasetype();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
988 switch (tb.ty)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
989 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
990 // Perhaps we can do better with this, see TypeFunction.callMatch()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
991 case Tsarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 TypeSArray tsa = cast(TypeSArray)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994 ulong sz = tsa.dim.toInteger();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
995 if (sz != nfargs - i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
997 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
998 case Tarray:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
999 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1000 TypeArray ta = cast(TypeArray)tb;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 for (; i < nfargs; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 87
diff changeset
1003 auto arg = fargs[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1004 assert(arg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 /* If lazy array of delegates,
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 * convert arg(s) to delegate(s)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1009 Type tret = fparam.isLazyArray();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 if (tret)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1011 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1012 if (ta.next.equals(arg.type))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1013 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1014 m = MATCHexact;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1015 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1016 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1017 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1018 m = arg.implicitConvTo(tret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1019 if (m == MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1020 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1021 if (tret.toBasetype().ty == Tvoid)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1022 m = MATCHconvert;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1023 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1024 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1025 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1026 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1027 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1028 m = arg.type.deduceType(paramscope, ta.next, parameters, dedtypes);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1029 //m = arg.implicitConvTo(ta.next);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1030 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1031 if (m == MATCHnomatch)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1032 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1033 if (m < match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1034 match = m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1035 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1036 goto Lmatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1037 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1038 case Tclass:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1039 case Tident:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1040 goto Lmatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1041
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1042 default:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1043 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1044 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1045 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1046
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1047 Lmatch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1048
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1049 /* Fill in any missing arguments with their defaults.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1050 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1051 for (size_t i = nargsi; i < dedargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1052 {
121
347de076ad34 TemplateParameters -> Vector
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
1053 auto tp2 = parameters[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1054 //printf("tp2[%d] = %s\n", i, tp2.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1055 /* For T:T*, the dedargs is the T*, dedtypes is the T
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1056 * But for function templates, we really need them to match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1057 */
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
1058 Object oarg = dedargs[i];
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
1059 Object oded = dedtypes[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1060 //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1061 //if (oarg) printf("oarg: %s\n", oarg.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1062 //if (oded) printf("oded: %s\n", oded.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1063 if (!oarg)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1064 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1065 if (oded)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1066 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1067 if (tp2.specialization())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1068 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1069 /* The specialization can work as long as afterwards
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1070 * the oded == oarg
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1071 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1072 Declaration sparam;
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
1073 dedargs[i] = oded;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1074 MATCH m2 = tp2.matchArg(paramscope, dedargs, i, parameters, dedtypes, &sparam, 0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1075 //printf("m2 = %d\n", m2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1076 if (!m2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1077 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1078 if (m2 < match)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1079 match = m2; // pick worst match
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
1080 if (dedtypes[i] !is oded)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1081 error("specialization not allowed for deduced parameter %s", tp2.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1082 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1083 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1084 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1085 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1086 oded = tp2.defaultArg(loc, paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1087 if (!oded)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1088 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1089 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1090 declareParameter(paramscope, tp2, oded);
94
3a0b150c9841 Objects -> Vector!Object iteration 1
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 90
diff changeset
1091 dedargs[i] = oded;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1092 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1094
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095 version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1096 if (constraint)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1097 { /* Check to see if constraint is satisfied.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1098 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1099 makeParamNamesVisibleInConstraint(paramscope);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100 Expression e = constraint.syntaxCopy();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 paramscope.flags |= SCOPE.SCOPEstaticif;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1102 e = e.semantic(paramscope);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 e = e.optimize(WANTvalue | WANTinterpret);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1104 if (e.isBool(true)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1105 ;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1106 } else if (e.isBool(false))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1107 goto Lnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1108 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 e.error("constraint %s is not constant or does not evaluate to a bool", e.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1112 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1114
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1115 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 for (i = 0; i < dedargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1117 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118 Type t = cast(Type)dedargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 printf("\tdedargs[%d] = %d, %s\n", i, t.dyncast(), t.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1120 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1122
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1123 paramscope.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1124 //printf("\tmatch %d\n", match);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1125 return match;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1126
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1127 Lnomatch:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1128 paramscope.pop();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1129 //printf("\tnomatch\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1130 return MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1131 }
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1132
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1133 /*************************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1134 * Given function arguments, figure out which template function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1135 * to expand, and return that function.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1136 * If no match, give error message and return null.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1137 * Input:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1138 * sc instantiation scope
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1139 * loc instantiation location
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1140 * targsi initial list of template arguments
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1141 * ethis if !null, the 'this' pointer argument
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1142 * fargs arguments to function
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1143 * flags 1: do not issue error message on no match, just return null
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1144 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1145 FuncDeclaration deduceFunctionTemplate(Scope sc, Loc loc, Objects targsi, Expression ethis, Expressions fargs, int flags = 0)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1146 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1147 MATCH m_best = MATCHnomatch;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1148 TemplateDeclaration td_ambig = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1149 TemplateDeclaration td_best = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1150 Objects tdargs = new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1151 TemplateInstance ti;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1152 FuncDeclaration fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1153
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1154 static if (false) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1155 printf("TemplateDeclaration.deduceFunctionTemplate() %s\n", toChars());
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1156 printf(" targsi:\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1157 if (targsi)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1158 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1159 for (int i = 0; i < targsi.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1160 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1161 Object arg = cast(Object)targsi.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1162 printf("\t%s\n", arg.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1163 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1164 }
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1165 printf(" fargs:\n");
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1166 for (int i = 0; i < fargs.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1167 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1168 Expression arg = cast(Expression)fargs.data[i];
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1169 printf("\t%s %s\n", arg.type.toChars(), arg.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1170 //printf("\tty = %d\n", arg.type.ty);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1171 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1172 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1173
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1174 for (TemplateDeclaration td = this; td; td = td.overnext)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1175 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1176 if (!td.semanticRun)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1177 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1178 error("forward reference to template %s", td.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1179 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1180 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1181 if (!td.onemember || !td.onemember.toAlias().isFuncDeclaration())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1182 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1183 error("is not a function template");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1184 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1185 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1186
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1187 MATCH m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1188 scope Objects dedargs = new Objects();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1189
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1190 m = td.deduceFunctionTemplateMatch(loc, targsi, ethis, fargs, dedargs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1191 //printf("deduceFunctionTemplateMatch = %d\n", m);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1192 if (!m) // if no match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1193 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1194
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1195 if (m < m_best)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1196 goto Ltd_best;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1197 if (m > m_best)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1198 goto Ltd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1199
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1200 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1201 // Disambiguate by picking the most specialized TemplateDeclaration
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1202 MATCH c1 = td.leastAsSpecialized(td_best);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1203 MATCH c2 = td_best.leastAsSpecialized(td);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1204 //printf("c1 = %d, c2 = %d\n", c1, c2);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1206 if (c1 > c2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1207 goto Ltd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1208 else if (c1 < c2)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1209 goto Ltd_best;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1210 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1211 goto Lambig;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1212 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1213
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1214 Lambig: // td_best and td are ambiguous
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1215 td_ambig = td;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1216 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1217
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1218 Ltd_best: // td_best is the best match so far
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1219 td_ambig = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1220 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1221
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1222 Ltd: // td is the new best match
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1223 td_ambig = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1224 assert(cast(size_t)cast(void*)td.scope_ > 0x10000);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1225 td_best = td;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1226 m_best = m;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1227 tdargs.setDim(dedargs.dim);
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
1228 memcpy(tdargs.ptr, dedargs.ptr, tdargs.dim * (void*).sizeof);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1229 continue;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1230 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1231 if (!td_best)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1232 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1233 if (!(flags & 1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1234 error(loc, "does not match any function template declaration");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1235 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1236 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1237 if (td_ambig)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1238 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1239 error(loc, "matches more than one function template declaration:\n %s\nand:\n %s",
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1240 td_best.toChars(), td_ambig.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1241 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1242
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1243 /* The best match is td_best with arguments tdargs.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1244 * Now instantiate the template.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1245 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1246 assert(cast(size_t)cast(void*)td_best.scope_ > 0x10000);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1247 ti = new TemplateInstance(loc, td_best, tdargs);
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1248 ti.semantic(sc, fargs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1249 fd = ti.toAlias().isFuncDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1250 if (!fd)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1251 goto Lerror;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1252 return fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1253
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1254 Lerror:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1255 /// version (DMDV2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1256 if (!(flags & 1))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1257 /// }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1258 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1259 HdrGenState hgs;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1260
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1261 scope OutBuffer bufa = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1262 Objects args = targsi;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1263 if (args)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1264 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1265 for (int i = 0; i < args.dim; i++)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1266 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1267 if (i)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1268 bufa.writeByte(',');
113
3482c73a991b More cleanup for arrays
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 110
diff changeset
1269 Object oarg = args[i];
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1270 ObjectToCBuffer(bufa, &hgs, oarg);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1271 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1272 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1273
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1274 scope OutBuffer buf = new OutBuffer();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1275 argExpTypesToCBuffer(buf, fargs, &hgs);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1276 error(loc, "cannot deduce template function from argument types !(%s)(%s)", bufa.toChars(), buf.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1277 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1278 return null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1279 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1280
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1281 /**************************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1282 * Declare template parameter tp with value o, and install it in the scope sc.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1283 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1284 void declareParameter(Scope sc, TemplateParameter tp, Object o)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1285 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1286 //printf("TemplateDeclaration.declareParameter('%s', o = %p)\n", tp.ident.toChars(), o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1287
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1288 Type targ = isType(o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1289 Expression ea = isExpression(o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1290 Dsymbol sa = isDsymbol(o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1291 Tuple va = isTuple(o);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1292
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1293 Dsymbol s;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1294
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1295 // See if tp.ident already exists with a matching definition
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1296 Dsymbol scopesym;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1297 s = sc.search(loc, tp.ident, &scopesym);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1298 if (s && scopesym == sc.scopesym)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1299 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1300 TupleDeclaration td = s.isTupleDeclaration();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1301 if (va && td)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1302 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1303 Tuple tup = new Tuple();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1304 assert(false); // < not implemented
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1305 ///tup.objects = *td.objects;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1306 if (match(va, tup, this, sc))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1307 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1308 return;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1309 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1310 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1311 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1312
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1313 if (targ)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1314 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1315 //printf("type %s\n", targ.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1316 s = new AliasDeclaration(Loc(0), tp.ident, targ);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1317 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1318 else if (sa)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1319 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1320 //printf("Alias %s %s;\n", sa.ident.toChars(), tp.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1321 s = new AliasDeclaration(Loc(0), tp.ident, sa);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1322 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1323 else if (ea)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1324 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1325 // tdtypes.data[i] always matches ea here
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1326 Initializer init = new ExpInitializer(loc, ea);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1327 TemplateValueParameter tvp = tp.isTemplateValueParameter();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1328
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1329 Type t = tvp ? tvp.valType : null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1330
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1331 VarDeclaration v = new VarDeclaration(loc, t, tp.ident, init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1332 v.storage_class = STCmanifest;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1333 s = v;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1334 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1335 else if (va)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1336 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1337 //printf("\ttuple\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1338 s = new TupleDeclaration(loc, tp.ident, va.objects);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1339 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1340 else
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1342 debug writefln(o.toString());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1343 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1344 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1345
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1346 if (!sc.insert(s))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1347 error("declaration %s is already defined", tp.ident.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1349 s.semantic(sc);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1350 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1351
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1352 override TemplateDeclaration isTemplateDeclaration() { return this; }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1353
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1354 TemplateTupleParameter isVariadic()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1356 return .isVariadic(parameters);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1357 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1358
63
cab4c37afb89 A bunch of implementations
korDen
parents: 51
diff changeset
1359 /***********************************
cab4c37afb89 A bunch of implementations
korDen
parents: 51
diff changeset
1360 * We can overload templates.
cab4c37afb89 A bunch of implementations
korDen
parents: 51
diff changeset
1361 */
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1362 override bool isOverloadable()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1363 {
104
a1cf34da9ebe + TemplateDeclaration.toCBuffer
Trass3r
parents: 94
diff changeset
1364 return true;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1365 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1366
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1367 /****************************
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1368 * Declare all the function parameters as variables
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1369 * and add them to the scope
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1370 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1371 void makeParamNamesVisibleInConstraint(Scope paramscope)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1372 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1373 /* We do this ONLY if there is only one function in the template.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1374 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1375 FuncDeclaration fd = onemember && onemember.toAlias() ?
131
206db751bd4c dmdfe 2.037 compiles now
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
1376 onemember.toAlias().isFuncDeclaration() : null;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1377 if (fd)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1378 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1379 paramscope.parent = fd;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1380 int fvarargs; // function varargs
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 131
diff changeset
1381 Parameters fparameters = fd.getParameters(&fvarargs);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1382 size_t nfparams = Parameter.dim(fparameters); // Num function parameters
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1383 for (int i = 0; i < nfparams; i++)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1384 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1385 Parameter fparam = Parameter.getNth(fparameters, i).syntaxCopy();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1386 if (!fparam.ident)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1387 continue; // don't add it, if it has no name
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1388 Type vtype = fparam.type.syntaxCopy();
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1389 // isPure will segfault if called on a ctor, because fd->type is null.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1390 if (fd.type && fd.isPure())
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1391 vtype = vtype.addMod(MODconst);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1392 VarDeclaration v = new VarDeclaration(loc, vtype, fparam.ident, null);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1393 v.storage_class |= STCparameter;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1394 // Not sure if this condition is correct/necessary.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1395 // It's from func.c
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1396 if (//fd->type && fd->type->ty == Tfunction &&
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1397 fvarargs == 2 && i + 1 == nfparams)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1398 v.storage_class |= STCvariadic;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1399
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1400 v.storage_class |= fparam.storageClass & (STCin | STCout | STCref | STClazy | STCfinal | STC_TYPECTOR | STCnodtor);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1401 v.semantic(paramscope);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1402 if (!paramscope.insert(v))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1403 error("parameter %s.%s is already defined", toChars(), v.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1404 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1405 v.parent = this;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1406 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1407 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 128
diff changeset
1408 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 63
diff changeset
1409 }