annotate dmd/template.c @ 1138:4c8bb03e4fbc

Update DtoConstFP() to be correct after LLVM r67562, which changed the way the APFloat constructor expects its i80 APInts to be formatted. (They're now actually consistent with the x87 format)
author Frits van Bommel <fvbommel wxs.nl>
date Tue, 24 Mar 2009 15:24:59 +0100
parents b30fe7e1dbb9
children 1860414bf3b7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2 // Compiler implementation of the D programming language
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3 // Copyright (c) 1999-2009 by Digital Mars
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
5 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
6 // http://www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
7 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
9 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
10
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
11 // Handle template implementation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
12
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
13 #include <stdio.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
14 #include <assert.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
15
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
16 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
17 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
18 #include <windows.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
19 long __cdecl __ehfilter(LPEXCEPTION_POINTERS ep);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
20 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
21 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
22
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
23 #include "root.h"
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
24 #include "rmem.h"
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
25 #include "stringtable.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
26 #include "mars.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
27 #include "identifier.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
28 #include "mtype.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
29 #include "template.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
30 #include "init.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
31 #include "expression.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
32 #include "scope.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
33 #include "module.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
34 #include "aggregate.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
35 #include "declaration.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
36 #include "dsymbol.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
37 #include "hdrgen.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
38
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
39 #define LOG 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
40
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
41 /********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
42 * These functions substitute for dynamic_cast. dynamic_cast does not work
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
43 * on earlier versions of gcc.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
44 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
45
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
46 Expression *isExpression(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
47 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
48 //return dynamic_cast<Expression *>(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
49 if (!o || o->dyncast() != DYNCAST_EXPRESSION)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
50 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
51 return (Expression *)o;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
52 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
53
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
54 Dsymbol *isDsymbol(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
55 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
56 //return dynamic_cast<Dsymbol *>(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
57 if (!o || o->dyncast() != DYNCAST_DSYMBOL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
58 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
59 return (Dsymbol *)o;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
60 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
61
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
62 Type *isType(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
63 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
64 //return dynamic_cast<Type *>(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
65 if (!o || o->dyncast() != DYNCAST_TYPE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
66 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
67 return (Type *)o;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
68 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
69
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
70 Tuple *isTuple(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
71 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
72 //return dynamic_cast<Tuple *>(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
73 if (!o || o->dyncast() != DYNCAST_TUPLE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
74 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
75 return (Tuple *)o;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
76 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
77
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
78
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
79 /***********************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
80 * Try to get arg as a type.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
81 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
82
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
83 Type *getType(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
84 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
85 Type *t = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
86 if (!t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
87 { Expression *e = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
88 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
89 t = e->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
90 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
91 return t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
92 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
93
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
94 Dsymbol *getDsymbol(Object *oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
95 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
96 Dsymbol *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
97 Expression *ea = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
98 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
99 { // Try to convert Expression to symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
100 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
101 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
102 else if (ea->op == TOKfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
103 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
104 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
105 sa = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
106 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
107 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
108 { // Try to convert Type to symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
109 Type *ta = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
110 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
111 sa = ta->toDsymbol(NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
112 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
113 sa = isDsymbol(oarg); // if already a symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
114 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
115 return sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
116 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
117
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
118 /******************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
119 * If o1 matches o2, return 1.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
120 * Else, return 0.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
121 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
122
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
123 int match(Object *o1, Object *o2, TemplateDeclaration *tempdecl, Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
124 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
125 Type *t1 = isType(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
126 Type *t2 = isType(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
127 Expression *e1 = isExpression(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
128 Expression *e2 = isExpression(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
129 Dsymbol *s1 = isDsymbol(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
130 Dsymbol *s2 = isDsymbol(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
131 Tuple *v1 = isTuple(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
132 Tuple *v2 = isTuple(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
133
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
134 //printf("\t match t1 %p t2 %p, e1 %p e2 %p, s1 %p s2 %p, v1 %p v2 %p\n", t1,t2,e1,e2,s1,s2,v1,v2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
136 /* A proper implementation of the various equals() overrides
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
137 * should make it possible to just do o1->equals(o2), but
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
138 * we'll do that another day.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
139 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
140
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
141 if (t1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
142 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
143 /* if t1 is an instance of ti, then give error
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
144 * about recursive expansions.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
145 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
146 Dsymbol *s = t1->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
147 if (s && s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
148 { TemplateInstance *ti1 = s->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
149 if (ti1 && ti1->tempdecl == tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
150 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
151 for (Scope *sc1 = sc; sc1; sc1 = sc1->enclosing)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
152 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
153 if (sc1->scopesym == ti1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
154 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
155 error("recursive template expansion for template argument %s", t1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
156 return 1; // fake a match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
157 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
158 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
159 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
160 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
161
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
162 if (!t2 || !t1->equals(t2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
163 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
164 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
165 else if (e1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
166 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
167 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
168 if (e1 && e2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
169 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
170 printf("match %d\n", e1->equals(e2));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
171 e1->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
172 e2->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
173 e1->type->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
174 e2->type->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
175 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
176 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
177 if (!e2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
178 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
179 if (!e1->equals(e2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
180 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
181 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
182 else if (s1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
183 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
184 //printf("%p %s, %p %s\n", s1, s1->toChars(), s2, s2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
185 if (!s2 || !s1->equals(s2) || s1->parent != s2->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
186 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
187 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
188 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
189 #if V2
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
190 VarDeclaration *v1 = s1->isVarDeclaration();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
191 VarDeclaration *v2 = s2->isVarDeclaration();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
192 if (v1 && v2 && v1->storage_class & v2->storage_class & STCmanifest)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
193 { ExpInitializer *ei1 = v1->init->isExpInitializer();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
194 ExpInitializer *ei2 = v2->init->isExpInitializer();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
195 if (ei1 && ei2 && !ei1->exp->equals(ei2->exp))
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
196 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
197 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
198 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
199 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
200 else if (v1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
201 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
202 if (!v2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
203 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
204 if (v1->objects.dim != v2->objects.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
205 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
206 for (size_t i = 0; i < v1->objects.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
207 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
208 if (!match((Object *)v1->objects.data[i],
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
209 (Object *)v2->objects.data[i],
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
210 tempdecl, sc))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
211 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
212 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
213 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
214 //printf("match\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
215 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
216 Lnomatch:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
217 //printf("nomatch\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
218 return 0; // nomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
219 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
220
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
221 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
222 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
223
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
224 void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
225 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
226 //printf("ObjectToCBuffer()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
227 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
228 Expression *e = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
229 Dsymbol *s = isDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
230 Tuple *v = isTuple(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
231 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
232 { //printf("\tt: %s ty = %d\n", t->toChars(), t->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
233 t->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
234 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
235 else if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
236 e->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
237 else if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
238 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
239 char *p = s->ident ? s->ident->toChars() : s->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
240 buf->writestring(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
241 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
242 else if (v)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
243 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
244 Objects *args = &v->objects;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
245 for (size_t i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
246 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
247 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
248 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
249 Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
250 ObjectToCBuffer(buf, hgs, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
251 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
252 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
253 else if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
254 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
255 buf->writestring("NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
256 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
257 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
258 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
259 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
260 printf("bad Object = %p\n", oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
261 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
262 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
263 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
264 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
265
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
266 #if V2
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
267 Object *objectSyntaxCopy(Object *o)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
268 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
269 if (!o)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
270 return NULL;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
271 Type *t = isType(o);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
272 if (t)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
273 return t->syntaxCopy();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
274 Expression *e = isExpression(o);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
275 if (e)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
276 return e->syntaxCopy();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
277 return o;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
278 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
279 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
280
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
282 /* ======================== TemplateDeclaration ============================= */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
283
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
284 TemplateDeclaration::TemplateDeclaration(Loc loc, Identifier *id, TemplateParameters *parameters, Array *decldefs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
285 : ScopeDsymbol(id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
286 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
287 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
288 printf("TemplateDeclaration(this = %p, id = '%s')\n", this, id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
289 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
290 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
291 if (parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
292 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
293 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
294 //printf("\tparameter[%d] = %p\n", i, tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
295 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
296
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
297 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
298 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
299 printf("\tparameter[%d] = %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
300 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
301 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
302 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
303 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
304 this->parameters = parameters;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
305 this->origParameters = parameters;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
306 #if V2
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
307 this->constraint = constraint;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
308 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
309 this->members = decldefs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
310 this->overnext = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
311 this->overroot = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
312 this->scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
313 this->onemember = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
314 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
315
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
316 Dsymbol *TemplateDeclaration::syntaxCopy(Dsymbol *)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
317 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
318 //printf("TemplateDeclaration::syntaxCopy()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
319 TemplateDeclaration *td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
320 TemplateParameters *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
321 Array *d;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
322
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
323 p = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
324 if (parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
325 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
326 p = new TemplateParameters();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
327 p->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
328 for (int i = 0; i < p->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
329 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
330 p->data[i] = (void *)tp->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
331 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
332 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
333 #if V2
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
334 Expression *e = NULL;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
335 if (constraint)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
336 e = constraint->syntaxCopy();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
337 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
338 d = Dsymbol::arraySyntaxCopy(members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
339 td = new TemplateDeclaration(loc, ident, p, d);
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
340
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 561
diff changeset
341 // LDC
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
342 td->intrinsicName = intrinsicName;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
343
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
344 return td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
345 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
346
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
347 void TemplateDeclaration::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
348 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
349 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
350 printf("TemplateDeclaration::semantic(this = %p, id = '%s')\n", this, ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
351 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
352 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
353 return; // semantic() already run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
354
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
355 if (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
356 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
357 #if DMDV1
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
358 error("cannot declare template at function scope %s", sc->func->toChars());
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
359 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
360 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
361
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
362 if (/*global.params.useArrayBounds &&*/ sc->module)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
363 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
364 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
365 // when template is instantiated in other modules
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
366 sc->module->toModuleArray();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
367 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
368
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
369 if (/*global.params.useAssert &&*/ sc->module)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
370 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
371 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
372 // when template is instantiated in other modules
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
373 sc->module->toModuleAssert();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
374 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
375
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
376 /* Remember Scope for later instantiations, but make
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
377 * a copy since attributes can change.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
378 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
379 this->scope = new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
380 this->scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
381
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
382 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
383 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
384 paramsym->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
385 Scope *paramscope = sc->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
386 paramscope->parameterSpecialization = 1;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
387 paramscope->stc = 0;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
388
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
389 if (global.params.doDocComments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
390 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
391 origParameters = new TemplateParameters();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
392 origParameters->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
393 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
394 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
395 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
396 origParameters->data[i] = (void *)tp->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
397 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
398 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
399
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
400 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
401 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
402 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
403
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
404 tp->declareParameter(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
405 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
406
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
407 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
408 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
409 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
410
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
411 tp->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
412 if (i + 1 != parameters->dim && tp->isTemplateTupleParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
413 error("template tuple parameter must be last one");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
414 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
415
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
416 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
417
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
418 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
419 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
420 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
421 if (Dsymbol::oneMembers(members, &s))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
422 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
423 if (s && s->ident && s->ident->equals(ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
424 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
425 onemember = s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
426 s->parent = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
427 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
428 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
429 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
430
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
431 /* BUG: should check:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
432 * o no virtual functions or non-static data members of classes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
433 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
434 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
436 const char *TemplateDeclaration::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
437 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
438 return (onemember && onemember->isAggregateDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
439 ? onemember->kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
440 : (char *)"template";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
441 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
442
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
443 /**********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
444 * Overload existing TemplateDeclaration 'this' with the new one 's'.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
445 * Return !=0 if successful; i.e. no conflict.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
446 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
447
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
448 int TemplateDeclaration::overloadInsert(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
449 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
450 TemplateDeclaration **pf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
451 TemplateDeclaration *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
452
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
453 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
454 printf("TemplateDeclaration::overloadInsert('%s')\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
455 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
456 f = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
457 if (!f)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
458 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
459 TemplateDeclaration *pthis = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
460 for (pf = &pthis; *pf; pf = &(*pf)->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
461 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
462 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
463 // Conflict if TemplateParameter's match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
464 // Will get caught anyway later with TemplateInstance, but
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
465 // should check it now.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
466 TemplateDeclaration *f2 = *pf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
467
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
468 if (f->parameters->dim != f2->parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
469 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
470
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
471 for (int i = 0; i < f->parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
472 { TemplateParameter *p1 = (TemplateParameter *)f->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
473 TemplateParameter *p2 = (TemplateParameter *)f2->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
474
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
475 if (!p1->overloadMatch(p2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
476 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
477 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
478
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
479 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
480 printf("\tfalse: conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
481 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
482 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
483
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
484 Lcontinue:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
485 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
486 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
487 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
488
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
489 f->overroot = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
490 *pf = f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
491 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
492 printf("\ttrue: no conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
493 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
494 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
495 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
496
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
497 /***************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
498 * Given that ti is an instance of this TemplateDeclaration,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
499 * deduce the types of the parameters to this, and store
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
500 * those deduced types in dedtypes[].
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
501 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
502 * flag 1: don't do semantic() because of dummy types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
503 * 2: don't change types in matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
504 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
505 * dedtypes deduced arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
506 * Return match level.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
507 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
508
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
509 MATCH TemplateDeclaration::matchWithInstance(TemplateInstance *ti,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
510 Objects *dedtypes, int flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
511 { MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
512 int dedtypes_dim = dedtypes->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
513
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
514 #define LOGM 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
515 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
516 printf("\n+TemplateDeclaration::matchWithInstance(this = %s, ti = %s, flag = %d)\n", toChars(), ti->toChars(), flag);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
517 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
518
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
519 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
520 printf("dedtypes->dim = %d, parameters->dim = %d\n", dedtypes_dim, parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
521 if (ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
522 printf("ti->tiargs->dim = %d, [0] = %p\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
523 ti->tiargs->dim,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
524 ti->tiargs->data[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
525 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
526 dedtypes->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
527
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
528 int parameters_dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
529 int variadic = isVariadic() != NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
530
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
531 // If more arguments than parameters, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
532 if (ti->tiargs->dim > parameters_dim && !variadic)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
533 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
534 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
535 printf(" no match: more arguments than parameters\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
536 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
537 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
538 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
539
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
540 assert(dedtypes_dim == parameters_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
541 assert(dedtypes_dim >= ti->tiargs->dim || variadic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
542
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
543 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
544 assert((size_t)scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
545 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
546 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
547 Scope *paramscope = scope->push(paramsym);
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
548 paramscope->stc = 0;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
549
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
550 // Attempt type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
551 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
552 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
553 { MATCH m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
554 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
555 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
556
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
557 //printf("\targument [%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
558 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
559 //printf("\targument [%d] is %s\n", i, oarg ? oarg->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
560 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
561 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
562 printf("\tparameter[%d] is %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
563 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
564
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
565 #if DMDV1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
566 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
567 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
568 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam, (flag & 2) ? 1 : 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
569
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
570 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
571 //printf("\tm2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
572
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
573 if (m2 == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
574 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
575 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
576 printf("\tmatchArg() for parameter %i failed\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
577 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
578 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
579 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
580
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
581 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
582 m = m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
583
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
584 if (!flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
585 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
586 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
587 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
588 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
589
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
590 if (!flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
591 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
592 /* Any parameter left without a type gets the type of
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
593 * its corresponding arg
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
594 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
595 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
596 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
597 if (!dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
598 { assert(i < ti->tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
599 dedtypes->data[i] = ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
600 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
601 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
602 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
603
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
604 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
605 if (m && constraint && !(flag & 1))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
606 { /* Check to see if constraint is satisfied.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
607 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
608 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
609 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
610 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
611 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
612 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
613 ;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
614 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
615 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
616 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
617 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
618 e->error("constraint %s is not constant or does not evaluate to a bool", e->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
619 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
620 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
621 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
622
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
623 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
624 // Print out the results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
625 printf("--------------------------\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
626 printf("template %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
627 printf("instance %s\n", ti->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
628 if (m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
629 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
630 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
631 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
632 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
633 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
634
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
635 printf(" [%d]", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
636
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
637 if (i < ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
638 oarg = (Object *)ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
639 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
640 oarg = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
641 tp->print(oarg, (Object *)dedtypes->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
642 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
643 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
644 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
645 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
646 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
647
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
648 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
649 printf(" match = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
650 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
651 goto Lret;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
652
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
653 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
654 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
655 printf(" no match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
656 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
657 m = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
658
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
659 Lret:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
660 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
661 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
662 printf("-TemplateDeclaration::matchWithInstance(this = %p, ti = %p) = %d\n", this, ti, m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
663 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
664 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
665 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
666
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
667 /********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
668 * Determine partial specialization order of 'this' vs td2.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
669 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
670 * 1 this is at least as specialized as td2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
671 * 0 td2 is more specialized than this
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
672 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
673
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
674 int TemplateDeclaration::leastAsSpecialized(TemplateDeclaration *td2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
675 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
676 /* This works by taking the template parameters to this template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
677 * declaration and feeding them to td2 as if it were a template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
678 * instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
679 * If it works, then this template is at least as specialized
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
680 * as td2.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
681 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
682
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
683 TemplateInstance ti(0, ident); // create dummy template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
684 Objects dedtypes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
685
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
686 #define LOG_LEASTAS 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
687
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
688 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
689 printf("%s.leastAsSpecialized(%s)\n", toChars(), td2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
690 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
691
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
692 // Set type arguments to dummy template instance to be types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
693 // generated from the parameters to this template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 ti.tiargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
695 ti.tiargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
696 for (int i = 0; i < ti.tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
697 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
698 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
699
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
700 void *p = tp->dummyArg();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
701 if (p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
702 ti.tiargs->data[i] = p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
703 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
704 ti.tiargs->setDim(i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
705 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
706
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
707 // Temporary Array to hold deduced types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
708 //dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
709 dedtypes.setDim(td2->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
710
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
711 // Attempt a type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
712 if (td2->matchWithInstance(&ti, &dedtypes, 1))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
713 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
714 /* A non-variadic template is more specialized than a
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
715 * variadic one.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
716 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
717 if (isVariadic() && !td2->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
718 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
719
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
720 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
721 printf(" matches, so is least as specialized\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
722 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
723 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
724 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
725 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
726 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
727 printf(" doesn't match, so is not as specialized\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
728 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
729 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
730 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
731
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
732
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
733 /*************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
734 * Match function arguments against a specific template function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
735 * Input:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
736 * loc instantiation location
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
737 * targsi Expression/Type initial list of template arguments
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
738 * ethis 'this' argument if !NULL
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
739 * fargs arguments to function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
740 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
741 * dedargs Expression/Type deduced template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
742 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
743 * match level
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
744 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
745
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
746 MATCH TemplateDeclaration::deduceFunctionTemplateMatch(Loc loc, Objects *targsi,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
747 Expression *ethis, Expressions *fargs,
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
748 Objects *dedargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
749 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
750 size_t i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
751 size_t nfparams;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
752 size_t nfargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
753 size_t nargsi; // array size of targsi
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
754 int fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
755 int tuple_dim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
756 MATCH match = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
757 FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
758 TypeFunction *fdtype; // type of fd
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
759 TemplateTupleParameter *tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
760 Objects dedtypes; // for T:T*, the dedargs is the T*, dedtypes is the T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
761
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
762 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
763 printf("\nTemplateDeclaration::deduceFunctionTemplateMatch() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
764 for (i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
765 { Expression *e = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
766 printf("\tfarg[%d] is %s, type is %s\n", i, e->toChars(), e->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
767 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
768 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
769
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
770 assert((size_t)scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
771
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
772 dedargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
773 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
774
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
775 dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
776 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
777
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
778 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
779 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
780 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
781 Scope *paramscope = scope->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
782
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
783 tp = isVariadic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
784
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
785 nargsi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
786 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
787 { // Set initial template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
788
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
789 nargsi = targsi->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
790 if (nargsi > parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
791 { if (!tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
792 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
793 dedargs->setDim(nargsi);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
794 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
795 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
796
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
797 memcpy(dedargs->data, targsi->data, nargsi * sizeof(*dedargs->data));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
798
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
799 for (i = 0; i < nargsi; i++)
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
800 { assert(i < parameters->dim);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
801 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
802 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
803 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
804
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
805 m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
806 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
807 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
808 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
809 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
810 match = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
811
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
812 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
813 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
814 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
815 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
816 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
817
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
818 assert(fd->type->ty == Tfunction);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
819 fdtype = (TypeFunction *)fd->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
820
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
821 nfparams = Argument::dim(fdtype->parameters); // number of function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
822 nfargs = fargs->dim; // number of function arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
823
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
824 /* Check for match of function arguments with variadic template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
825 * parameter, such as:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
826 *
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
827 * template Foo(T, A...) { void Foo(T t, A a); }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
828 * void main() { Foo(1,2,3); }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
829 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
830 tp = isVariadic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
831 if (tp) // if variadic
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
832 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
833 if (nfparams == 0) // if no function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
834 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
835 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
836 //printf("t = %p\n", t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
837 dedargs->data[parameters->dim - 1] = (void *)t;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
838 declareParameter(paramscope, tp, t);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
839 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
840 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
841 else if (nfargs < nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
842 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
843 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
844 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
845 /* Figure out which of the function parameters matches
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
846 * the tuple template parameter. Do this by matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
847 * type identifiers.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
848 * Set the index of this function parameter to fptupindex.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
849 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
850 for (fptupindex = 0; fptupindex < nfparams; fptupindex++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
851 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
852 Argument *fparam = (Argument *)fdtype->parameters->data[fptupindex];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
853 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
854 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
855 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
856 if (!tp->ident->equals(tid->ident) || tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
857 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
858
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
859 if (fdtype->varargs) // variadic function doesn't
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
860 goto Lnomatch; // go with variadic template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
861
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
862 /* The types of the function arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
863 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
864 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
865 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
866 dedargs->data[parameters->dim - 1] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
867
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
868 tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
869 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
870 for (i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
871 { Expression *farg = (Expression *)fargs->data[fptupindex + i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
872 t->objects.data[i] = (void *)farg->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
873 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
874 declareParameter(paramscope, tp, t);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
875 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
876 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
877 fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
878 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
879 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
880
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
881 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
882 if (nfparams == nfargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
883 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
884 else if (nfargs > nfparams)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
885 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
886 if (fdtype->varargs == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
887 goto Lnomatch; // too many args, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
888 match = MATCHconvert; // match ... with a conversion
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
889 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
890
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
891 L2:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
892 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
893 // Match 'ethis' to any TemplateThisParameter's
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
894 if (ethis)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
895 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
896 for (size_t i = 0; i < parameters->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
897 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
898 TemplateThisParameter *ttp = tp->isTemplateThisParameter();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
899 if (ttp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
900 { MATCH m;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
901
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
902 Type *t = new TypeIdentifier(0, ttp->ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
903 m = ethis->type->deduceType(scope, t, parameters, &dedtypes);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
904 if (!m)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
905 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
906 if (m < match)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
907 match = m; // pick worst match
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
908 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
909 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
910 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
911 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
912
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
913 // Loop through the function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
914 for (i = 0; i < nfparams; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
915 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
916 /* Skip over function parameters which wound up
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
917 * as part of a template tuple parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
918 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
919 if (i == fptupindex)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
920 { if (fptupindex == nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
921 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
922 i += tuple_dim - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
923 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
924 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
925
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
926 Argument *fparam = Argument::getNth(fdtype->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
927
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
928 if (i >= nfargs) // if not enough arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
929 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
930 if (fparam->defaultArg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
931 { /* Default arguments do not participate in template argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
932 * deduction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
933 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
934 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
935 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
936 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
937 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
938 { Expression *farg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
939 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
940 printf("\tfarg->type = %s\n", farg->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
941 printf("\tfparam->type = %s\n", fparam->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
942 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
943
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
944 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
945 m = farg->type->deduceType(scope, fparam->type, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
946 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
947
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
948 /* If no match, see if there's a conversion to a delegate
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
949 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
950 if (!m && fparam->type->toBasetype()->ty == Tdelegate)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
951 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
952 TypeDelegate *td = (TypeDelegate *)fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
953 TypeFunction *tf = (TypeFunction *)td->next;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
954
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
955 if (!tf->varargs && Argument::dim(tf->parameters) == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
956 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
957 m = farg->type->deduceType(scope, tf->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
958 if (!m && tf->next->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
959 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
960 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
961 //printf("\tm2 = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
962 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
963
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
964 if (m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
965 { if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
966 match = m; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
967 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
968 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
969 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
970
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
971 /* The following code for variadic arguments closely
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
972 * matches TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
973 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
974 if (!(fdtype->varargs == 2 && i + 1 == nfparams))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
975 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
976
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
977 /* Check for match with function parameter T...
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
978 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
979 Type *tb = fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
980 switch (tb->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
981 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
982 // Perhaps we can do better with this, see TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
983 case Tsarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
984 { TypeSArray *tsa = (TypeSArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
985 integer_t sz = tsa->dim->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
986 if (sz != nfargs - i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
987 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
988 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
989 case Tarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
990 { TypeArray *ta = (TypeArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
991 for (; i < nfargs; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
992 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
993 Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
994 assert(arg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
995 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
996 /* If lazy array of delegates,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
997 * convert arg(s) to delegate(s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
998 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
999 Type *tret = fparam->isLazyArray();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1000 if (tret)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1001 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1002 if (ta->next->equals(arg->type))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1003 { m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1004 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1005 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1006 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1007 m = arg->implicitConvTo(tret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1008 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1009 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1010 if (tret->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1011 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1012 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1013 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1014 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1015 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1016 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1017 m = arg->type->deduceType(scope, ta->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1018 //m = arg->implicitConvTo(ta->next);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1019 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1020 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1021 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1022 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1023 match = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1024 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1025 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1026 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1027 case Tclass:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1028 case Tident:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1029 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1030
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1031 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1032 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1033 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1034 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1035
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1036 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1037
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1038 /* Fill in any missing arguments with their defaults.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1039 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1040 for (i = nargsi; i < dedargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1041 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1042 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1043 //printf("tp[%d] = %s\n", i, tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1044 /* For T:T*, the dedargs is the T*, dedtypes is the T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1045 * But for function templates, we really need them to match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1046 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1047 Object *oarg = (Object *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1048 Object *oded = (Object *)dedtypes.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1049 //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1050 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1051 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1052 if (oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1053 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1054 if (tp->specialization())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1055 { /* The specialization can work as long as afterwards
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1056 * the oded == oarg
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1057 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1058 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1059 dedargs->data[i] = (void *)oded;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1060 MATCH m2 = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam, 0);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1061 //printf("m2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1062 if (!m2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1063 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1064 if (m2 < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1065 match = m2; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1066 if (dedtypes.data[i] != oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1067 error("specialization not allowed for deduced parameter %s", tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1068 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1069 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1070 else
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1071 { oded = tp->defaultArg(loc, paramscope);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1072 if (!oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1073 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1074 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1075 declareParameter(paramscope, tp, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1076 dedargs->data[i] = (void *)oded;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1077 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1078 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1079
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1080 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1081 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1082 { /* Check to see if constraint is satisfied.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1083 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1084 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1085 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1086 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1087 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1088 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1089 ;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1090 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1091 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1092 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1093 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1094 e->error("constraint %s is not constant or does not evaluate to a bool", e->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1095 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1096 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1097 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1098
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1099 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1100 for (i = 0; i < dedargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1101 { Type *t = (Type *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1102 printf("\tdedargs[%d] = %d, %s\n", i, t->dyncast(), t->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1103 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1104 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1105
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1106 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1107 //printf("\tmatch %d\n", match);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1108 return match;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1109
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1110 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1111 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1112 //printf("\tnomatch\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1113 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1114 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1115
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1116 /**************************************************
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1117 * Declare template parameter tp with value o, and install it in the scope sc.
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1118 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1119
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1120 void TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1121 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1122 //printf("TemplateDeclaration::declareParameter('%s', o = %p)\n", tp->ident->toChars(), o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1123
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1124 Type *targ = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1125 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1126 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1127 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1128
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1129 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1130
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1131 if (targ)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1132 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1133 //printf("type %s\n", targ->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1134 s = new AliasDeclaration(0, tp->ident, targ);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1135 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1136 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1137 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1138 //printf("Alias %s %s;\n", sa->ident->toChars(), tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1139 s = new AliasDeclaration(0, tp->ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1140 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1141 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1142 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1143 // tdtypes.data[i] always matches ea here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1144 Initializer *init = new ExpInitializer(loc, ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1145 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1146 assert(tvp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1147
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1148 VarDeclaration *v = new VarDeclaration(loc, tvp->valType, tp->ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1149 v->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1150 s = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1151 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1152 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1153 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1154 //printf("\ttuple\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1155 s = new TupleDeclaration(loc, tp->ident, &va->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1156 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1157 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1158 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1159 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1160 o->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1161 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1162 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1163 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1164 if (!sc->insert(s))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1165 error("declaration %s is already defined", tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1166 s->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1167 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1169 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1170 * Determine if TemplateDeclaration is variadic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1171 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1173 TemplateTupleParameter *isVariadic(TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1174 { size_t dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1175 TemplateTupleParameter *tp = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1176
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1177 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1178 tp = ((TemplateParameter *)parameters->data[dim - 1])->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1179 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1180 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1181
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1182 TemplateTupleParameter *TemplateDeclaration::isVariadic()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1183 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1184 return ::isVariadic(parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1185 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1186
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1187 /***********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1188 * We can overload templates.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1189 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1190
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1191 int TemplateDeclaration::isOverloadable()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1192 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1193 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1194 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1195
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1196 /*************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1197 * Given function arguments, figure out which template function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1198 * to expand, and return that function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1199 * If no match, give error message and return NULL.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1200 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1201 * sc instantiation scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1202 * loc instantiation location
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1203 * targsi initial list of template arguments
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1204 * ethis if !NULL, the 'this' pointer argument
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1205 * fargs arguments to function
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1206 * flags 1: do not issue error message on no match, just return NULL
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1207 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1208
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1209 FuncDeclaration *TemplateDeclaration::deduceFunctionTemplate(Scope *sc, Loc loc,
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1210 Objects *targsi, Expression *ethis, Expressions *fargs, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1211 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1212 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1213 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1214 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1215 Objects *tdargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1216 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1217 FuncDeclaration *fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1218
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1219 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1220 printf("TemplateDeclaration::deduceFunctionTemplate() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1221 printf(" targsi:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1222 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1223 { for (int i = 0; i < targsi->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1224 { Object *arg = (Object *)targsi->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1225 printf("\t%s\n", arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1226 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1227 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1228 printf(" fargs:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1229 for (int i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1230 { Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1231 printf("\t%s %s\n", arg->type->toChars(), arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1232 //printf("\tty = %d\n", arg->type->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1233 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1234 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1235
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1236 for (TemplateDeclaration *td = this; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1237 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1238 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1239 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1240 error("forward reference to template %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1241 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1242 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1243 if (!td->onemember || !td->onemember->toAlias()->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1244 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1245 error("is not a function template");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1246 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1247 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1248
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1249 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1250 Objects dedargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1251
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1252 m = td->deduceFunctionTemplateMatch(loc, targsi, ethis, fargs, &dedargs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1253 //printf("deduceFunctionTemplateMatch = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1254 if (!m) // if no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1255 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1256
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1257 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1258 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1259 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1260 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1261
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1262 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1263 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1264 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1265 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1266 //printf("c1 = %d, c2 = %d\n", c1, c2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1267
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1268 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1269 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1270 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1271 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1272 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1273 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1274 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1275
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1276 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1277 td_ambig = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1278 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1279
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1280 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1281 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1282 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1283
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1284 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1285 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1286 assert((size_t)td->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1287 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1288 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1289 tdargs->setDim(dedargs.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1290 memcpy(tdargs->data, dedargs.data, tdargs->dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1291 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1292 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1293 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1294 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1295 error(loc, "does not match any template declaration");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1296 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1297 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1298 if (td_ambig)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1299 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1300 error(loc, "matches more than one function template declaration:\n %s\nand:\n %s",
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1301 td_best->toChars(), td_ambig->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1302 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1303
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1304 /* The best match is td_best with arguments tdargs.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1305 * Now instantiate the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1306 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1307 assert((size_t)td_best->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1308 ti = new TemplateInstance(loc, td_best, tdargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1309 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1310 fd = ti->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1311 if (!fd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1312 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1313 return fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1314
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1315 Lerror:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1316 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1317 HdrGenState hgs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1318
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1319 OutBuffer bufa;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1320 Objects *args = targsi;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1321 if (args)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1322 { for (int i = 0; i < args->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1323 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1324 if (i)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1325 bufa.writeByte(',');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1326 Object *oarg = (Object *)args->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1327 ObjectToCBuffer(&bufa, &hgs, oarg);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1328 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1329 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1330
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1331 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1332 argExpTypesToCBuffer(&buf, fargs, &hgs);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1333 error(loc, "cannot deduce template function from argument types !(%s)(%s)",
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1334 bufa.toChars(), buf.toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1335 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1336 return NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1337 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1338
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1339 void TemplateDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1340 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1341 #if 0 // Should handle template functions
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1342 if (onemember && onemember->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1343 buf->writestring("foo ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1344 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1345 buf->writestring(kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1346 buf->writeByte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1347 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1348 buf->writeByte('(');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1349 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1350 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1351 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1352 if (hgs->ddoc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1353 tp = (TemplateParameter *)origParameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1354 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1355 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1356 tp->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1357 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1358 buf->writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1359 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1360 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1361 { buf->writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1362 constraint->toCBuffer(buf, hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1363 buf->writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1364 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1365 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1366
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1367 if (hgs->hdrgen)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1369 hgs->tpltMember++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1370 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1371 buf->writebyte('{');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1372 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1373 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1374 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1375 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1376 s->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1377 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1378 buf->writebyte('}');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1379 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1380 hgs->tpltMember--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1381 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1382 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1383
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1384
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1385 char *TemplateDeclaration::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1386 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1387 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1388
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1389 memset(&hgs, 0, sizeof(hgs));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1390 buf.writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1391 buf.writeByte('(');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1392 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1393 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1394 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1395 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1396 buf.writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1397 tp->toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1398 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1399 buf.writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1400 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1401 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1402 { buf.writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1403 constraint->toCBuffer(&buf, &hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1404 buf.writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1405 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1406 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1407 buf.writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1408 return (char *)buf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1409 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1410
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1411 /* ======================== Type ============================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1412
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1413 /****
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1414 * Given an identifier, figure out which TemplateParameter it is.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1415 * Return -1 if not found.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1416 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1417
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1418 int templateIdentifierLookup(Identifier *id, TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1419 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1420 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1421 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1422
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1423 if (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1424 return i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1425 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1426 return -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1427 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1428
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1429 int templateParameterLookup(Type *tparam, TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1430 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1431 assert(tparam->ty == Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1432 TypeIdentifier *tident = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1433 //printf("\ttident = '%s'\n", tident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1434 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1435 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1436 return templateIdentifierLookup(tident->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1437 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1438 return -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1439 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1440
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1441 /* These form the heart of template argument deduction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1442 * Given 'this' being the type argument to the template instance,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1443 * it is matched against the template declaration parameter specialization
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1444 * 'tparam' to determine the type to be used for the parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1445 * Example:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1446 * template Foo(T:T*) // template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1447 * Foo!(int*) // template instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1448 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1449 * this = int*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1450 * tparam = T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1451 * parameters = [ T:T* ] // Array of TemplateParameter's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1452 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1453 * dedtypes = [ int ] // Array of Expression/Type's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1454 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1455
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1456 MATCH Type::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1457 Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1458 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1459 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1460 printf("Type::deduceType()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1461 printf("\tthis = %d, ", ty); print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1462 printf("\ttparam = %d, ", tparam->ty); tparam->print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1463 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1464 if (!tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1465 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1466
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1467 if (this == tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1468 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1469
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1470 if (tparam->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1471 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1472 // Determine which parameter tparam is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1473 int i = templateParameterLookup(tparam, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1474 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1475 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1476 if (!sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1477 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1478
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1479 /* Need a loc to go with the semantic routine.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1480 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1481 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1482 if (parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1483 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1484 TemplateParameter *tp = (TemplateParameter *)parameters->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1485 loc = tp->loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1486 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1487
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1488 /* BUG: what if tparam is a template instance, that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1489 * has as an argument another Tident?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1490 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1491 tparam = tparam->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1492 assert(tparam->ty != Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1493 return deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1494 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1495
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1496 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1497
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1498 // Found the corresponding parameter tp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1499 if (!tp->isTemplateTypeParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1500 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1501 Type *at = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1502 if (!at)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1503 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1504 dedtypes->data[i] = (void *)this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1505 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1506 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1507 if (equals(at))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1508 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1509 else if (ty == Tclass && at->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1510 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1511 return (MATCH) implicitConvTo(at);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1512 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1513 else if (ty == Tsarray && at->ty == Tarray &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1514 nextOf()->equals(at->nextOf()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1515 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1516 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1517 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1518 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1519 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1520 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1521
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1522 if (ty != tparam->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1523 return implicitConvTo(tparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1524 // goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1525
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1526 if (nextOf())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1527 return nextOf()->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1528
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1529 Lexact:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1530 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1531
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1532 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1533 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1534 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1535
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1536 MATCH TypeSArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1537 Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1538 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1539 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1540 printf("TypeSArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1541 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1542 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1543 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1544
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1545 // Extra check that array dimensions must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1546 if (tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1547 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1548 if (tparam->ty == Tsarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1549 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1550 TypeSArray *tp = (TypeSArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1551
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1552 if (tp->dim->op == TOKvar &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1553 ((VarExp *)tp->dim)->var->storage_class & STCtemplateparameter)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1554 { int i = templateIdentifierLookup(((VarExp *)tp->dim)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1555 // This code matches code in TypeInstance::deduceType()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1556 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1557 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1558 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1559 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1560 if (!tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1561 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1562 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1563 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1564 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1565 if (!dim->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1566 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1567 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1568 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1569 { Type *vt = tvp->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1570 MATCH m = (MATCH)dim->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1571 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1572 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1573 dedtypes->data[i] = dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1574 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1575 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1576 else if (dim->toInteger() != tp->dim->toInteger())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1577 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1578 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1579 else if (tparam->ty == Taarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1580 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1581 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1582 if (tp->index->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1583 { TypeIdentifier *tident = (TypeIdentifier *)tp->index;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1584
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1585 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1586 { Identifier *id = tident->ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1587
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1588 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1589 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1590 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1591
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1592 if (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1593 { // Found the corresponding template parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1594 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1595 if (!tvp || !tvp->valType->isintegral())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1596 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1597
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1598 if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1599 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1600 if (!dim->equals((Object *)dedtypes->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1601 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1602 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1603 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1604 { dedtypes->data[i] = (void *)dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1605 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1606 return next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1607 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1608 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1609 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1610 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1611 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1612 else if (tparam->ty == Tarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1613 { MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1614
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1615 m = next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1616 if (m == MATCHexact)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1617 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1618 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1619 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1620 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1621 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1622
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1623 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1624 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1625 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1626
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1627 MATCH TypeAArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1628 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1629 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1630 printf("TypeAArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1631 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1632 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1633 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1634
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1635 // Extra check that index type must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1636 if (tparam && tparam->ty == Taarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1637 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1638 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1639 if (!index->deduceType(sc, tp->index, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1640 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1641 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1642 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1643 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1644 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1645 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1646
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1647 MATCH TypeFunction::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1648 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1649 //printf("TypeFunction::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1650 //printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1651 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1652
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1653 // Extra check that function characteristics must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1654 if (tparam && tparam->ty == Tfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1655 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1656 TypeFunction *tp = (TypeFunction *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1657 if (varargs != tp->varargs ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1658 linkage != tp->linkage)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1659 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1660
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1661 size_t nfargs = Argument::dim(this->parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1662 size_t nfparams = Argument::dim(tp->parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1663
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1664 /* See if tuple match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1665 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1666 if (nfparams > 0 && nfargs >= nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1667 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1668 /* See if 'A' of the template parameter matches 'A'
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1669 * of the type of the last function parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1670 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1671 Argument *fparam = (Argument *)tp->parameters->data[nfparams - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1672 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1673 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1674 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1675 if (tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1676 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1677
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1678 /* Look through parameters to find tuple matching tid->ident
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1679 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1680 size_t tupi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1681 for (; 1; tupi++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1682 { if (tupi == parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1683 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1684 TemplateParameter *t = (TemplateParameter *)parameters->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1685 TemplateTupleParameter *tup = t->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1686 if (tup && tup->ident->equals(tid->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1687 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1688 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1689
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1690 /* The types of the function arguments [nfparams - 1 .. nfargs]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1691 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1692 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1693 int tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1694
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1695 /* See if existing tuple, and whether it matches or not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1696 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1697 Object *o = (Object *)dedtypes->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1698 if (o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1699 { // Existing deduced argument must be a tuple, and must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1700 Tuple *t = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1701 if (!t || t->objects.dim != tuple_dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1702 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1703 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1704 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1705 if (!arg->type->equals((Object *)t->objects.data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1706 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1707 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1708 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1709 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1710 { // Create new tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1711 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1712 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1713 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1714 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1715 t->objects.data[i] = (void *)arg->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1716 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1717 dedtypes->data[tupi] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1718 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1719 nfparams--; // don't consider the last parameter for type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1720 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1721 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1722
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1723 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1724 if (nfargs != nfparams)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1725 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1726 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1727 for (size_t i = 0; i < nfparams; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1728 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1729 Argument *a = Argument::getNth(this->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1730 Argument *ap = Argument::getNth(tp->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1731 if (a->storageClass != ap->storageClass ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1732 !a->type->deduceType(sc, ap->type, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1733 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1734 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1735 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1736 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1737 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1738
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1739 MATCH TypeIdentifier::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1740 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1741 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1742 if (tparam && tparam->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1743 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1744 TypeIdentifier *tp = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1745
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1746 for (int i = 0; i < idents.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1747 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1748 Identifier *id1 = (Identifier *)idents.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1749 Identifier *id2 = (Identifier *)tp->idents.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1750
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1751 if (!id1->equals(id2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1752 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1753 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1754 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1755 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1756 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1757
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1758 MATCH TypeInstance::deduceType(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1759 Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1760 Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1761 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1762 //printf("TypeInstance::deduceType(tparam = %s) %s\n", tparam->toChars(), toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1763 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1764
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1765 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1766 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1767 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1768 TypeInstance *tp = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1769
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1770 //printf("tempinst->tempdecl = %p\n", tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1771 //printf("tp->tempinst->tempdecl = %p\n", tp->tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1772 if (!tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1773 { //printf("tp->tempinst->name = '%s'\n", tp->tempinst->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1774 if (!tp->tempinst->name->equals(tempinst->name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1775 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1776 /* Handle case of:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1777 * template Foo(T : sa!(T), alias sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1778 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1779 int i = templateIdentifierLookup(tp->tempinst->name, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1780 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1781 { /* Didn't find it as a parameter identifier. Try looking
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1782 * it up and seeing if is an alias. See Bugzilla 1454
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1783 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1784 Dsymbol *s = tempinst->tempdecl->scope->search(0, tp->tempinst->name, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1785 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1786 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1787 s = s->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1788 TemplateDeclaration *td = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1789 if (td && td == tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1790 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1791 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1792 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1793 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1794 TemplateParameter *tpx = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1795 // This logic duplicates tpx->matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1796 TemplateAliasParameter *ta = tpx->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1797 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1798 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1799 Dsymbol *sa = tempinst->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1800 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1801 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1802 if (ta->specAlias && sa != ta->specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1803 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1804 if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1805 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1806 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1807
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1808 if (s != sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1809 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1810 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1811 dedtypes->data[i] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1812 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1813 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1814 else if (tempinst->tempdecl != tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1815 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1816
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1817 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1818 if (tempinst->tiargs->dim != tp->tempinst->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1819 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1820
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1821 for (int i = 0; i < tempinst->tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1822 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1823 //printf("\ttest: tempinst->tiargs[%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1824 int j;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1825 Object *o1 = (Object *)tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1826 Object *o2 = (Object *)tp->tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1827
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1828 Type *t1 = isType(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1829 Type *t2 = isType(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1830
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1831 Expression *e1 = isExpression(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1832 Expression *e2 = isExpression(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1833
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1834 Dsymbol *s1 = isDsymbol(o1);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1835 Dsymbol *s2 = isDsymbol(o2);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1836
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1837 Tuple *v1 = isTuple(o1);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1838 Tuple *v2 = isTuple(o2);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1839 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1840 if (t1) printf("t1 = %s\n", t1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1841 if (t2) printf("t2 = %s\n", t2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1842 if (e1) printf("e1 = %s\n", e1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1843 if (e2) printf("e2 = %s\n", e2->toChars());
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1844 if (s1) printf("s1 = %s\n", s1->toChars());
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1845 if (s2) printf("s2 = %s\n", s2->toChars());
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1846 if (v1) printf("v1 = %s\n", v1->toChars());
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1847 if (v2) printf("v2 = %s\n", v2->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1848 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1849
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1850 if (t1 && t2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1851 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1852 if (!t1->deduceType(sc, t2, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1853 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1854 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1855 else if (e1 && e2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1856 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1857 if (!e1->equals(e2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1858 { if (e2->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1859 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1860 /*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1861 * (T:Number!(e2), int e2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1862 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1863 j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1864 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1865 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1866 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1867 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1868 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1869 else if (e1 && t2 && t2->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1870 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1871 j = templateParameterLookup(t2, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1872 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1873 if (j == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1874 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1875 TemplateParameter *tp = (TemplateParameter *)parameters->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1876 // BUG: use tp->matchArg() instead of the following
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1877 TemplateValueParameter *tv = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1878 if (!tv)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1879 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1880 Expression *e = (Expression *)dedtypes->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1881 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1882 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1883 if (!e1->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1884 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1885 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1886 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1887 { Type *vt = tv->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1888 MATCH m = (MATCH)e1->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1889 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1890 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1891 dedtypes->data[j] = e1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1892 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1893 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1894 else if (s1 && t2 && t2->ty == Tident)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1895 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1896 j = templateParameterLookup(t2, parameters);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1897 if (j == -1)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1898 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1899 TemplateParameter *tp = (TemplateParameter *)parameters->data[j];
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1900 // BUG: use tp->matchArg() instead of the following
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1901 TemplateAliasParameter *ta = tp->isTemplateAliasParameter();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1902 if (!ta)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1903 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1904 Dsymbol *s = (Dsymbol *)dedtypes->data[j];
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1905 if (s)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1906 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1907 if (!s1->equals(s))
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1908 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1909 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1910 else
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1911 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1912 dedtypes->data[j] = s1;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1913 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1914 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1915 else if (s1 && s2)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1916 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1917 if (!s1->equals(s2))
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1918 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1919 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1920 // BUG: Need to handle tuple parameters
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1921 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1922 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1923 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1924 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1925 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1926
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1927 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1928 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1929 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1930
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1931 MATCH TypeStruct::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1932 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1933 //printf("TypeStruct::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1934 //printf("\tthis->parent = %s, ", sym->parent->toChars()); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1935 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1936
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1937 /* If this struct is a template struct, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1938 * it against a template instance, convert the struct type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1939 * to a template instance, too, and try again.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1940 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1941 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1942
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1943 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1944 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1945 if (ti && ti->toAlias() == sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1946 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1947 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1948 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1949 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1950
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1951 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1952 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1953 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1954 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1955 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1956 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1957 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1958 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1959 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1960 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1961 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1962 /* Slice off the .foo in S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1963 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1964 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1965 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1966 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1967 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1968 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1969 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1970 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1971 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1972
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1973 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1974 if (tparam && tparam->ty == Tstruct)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1975 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1976 TypeStruct *tp = (TypeStruct *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1977
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1978 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1979 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1980 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1981 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1982 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1983
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1984 MATCH TypeEnum::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1985 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1986 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1987 if (tparam && tparam->ty == Tenum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1988 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1989 TypeEnum *tp = (TypeEnum *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1990
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1991 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1992 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1993 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1994 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1995 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1996
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1997 MATCH TypeTypedef::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1998 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1999 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2000 if (tparam && tparam->ty == Ttypedef)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2001 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2002 TypeTypedef *tp = (TypeTypedef *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2003
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2004 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2005 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2006 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2007 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2008 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2009
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2010 MATCH TypeClass::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2011 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2012 //printf("TypeClass::deduceType(this = %s)\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2013
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2014 /* If this class is a template class, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2015 * it against a template instance, convert the class type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2016 * to a template instance, too, and try again.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2017 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2018 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2019
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2020 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2021 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2022 if (ti && ti->toAlias() == sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2023 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2024 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2025 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2026 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2027
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2028 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2029 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2030 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2031 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2032 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2033 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2034 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2035 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2036 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2037 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2038 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2039 /* Slice off the .foo in S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2040 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2041 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2042 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2043 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2044 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2045 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2046 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2047 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2048 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2049
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2050 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2051 if (tparam && tparam->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2052 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2053 TypeClass *tp = (TypeClass *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2054
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2055 //printf("\t%d\n", (MATCH) implicitConvTo(tp));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2056 return (MATCH) implicitConvTo(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2057 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2058 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2059 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2060
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2061 /* ======================== TemplateParameter =============================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2062
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2063 TemplateParameter::TemplateParameter(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2064 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2065 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2066 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2067 this->sparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2068 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2069
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2070 TemplateTypeParameter *TemplateParameter::isTemplateTypeParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2071 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2072 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2073 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2074
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2075 TemplateValueParameter *TemplateParameter::isTemplateValueParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2076 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2077 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2078 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2079
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2080 TemplateAliasParameter *TemplateParameter::isTemplateAliasParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2081 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2082 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2083 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2084
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2085 TemplateTupleParameter *TemplateParameter::isTemplateTupleParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2086 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2087 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2088 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2089
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2090 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2091 TemplateThisParameter *TemplateParameter::isTemplateThisParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2092 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2093 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2094 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2095 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2096
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2097 /* ======================== TemplateTypeParameter =========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2098
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2099 // type-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2100
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2101 TemplateTypeParameter::TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2102 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2103 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2104 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2105 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2106 this->specType = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2107 this->defaultType = defaultType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2108 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2109
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2110 TemplateTypeParameter *TemplateTypeParameter::isTemplateTypeParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2111 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2112 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2113 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2114
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2115 TemplateParameter *TemplateTypeParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2116 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2117 TemplateTypeParameter *tp = new TemplateTypeParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2118 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2119 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2120 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2121 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2122 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2123 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2124
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2125 void TemplateTypeParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2126 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2127 //printf("TemplateTypeParameter::declareParameter('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2128 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2129 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2130 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2131 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2132 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2133
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2134 void TemplateTypeParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2135 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2136 //printf("TemplateTypeParameter::semantic('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2137 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2138 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2139 specType = specType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2140 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2141 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2142 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2143 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2144 defaultType = defaultType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2145 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2146 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2147 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2148
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2149 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2150 * Determine if two TemplateParameters are the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2151 * as far as TemplateDeclaration overloading goes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2152 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2153 * 1 match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2154 * 0 no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2155 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2156
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2157 int TemplateTypeParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2158 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2159 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2160
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2161 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2162 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2163 if (specType != ttp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2164 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2165
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2166 if (specType && !specType->equals(ttp->specType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2167 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2169 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2170 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2171
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2172 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2173 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2174 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2175
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2176 /*******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2177 * Match to a particular TemplateParameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2178 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2179 * i i'th argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2180 * tiargs[] actual arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2181 * parameters[] template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2182 * dedtypes[] deduced arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2183 * *psparam set to symbol declared and initialized to dedtypes[i]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2184 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2185
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2186 MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2187 int i, TemplateParameters *parameters, Objects *dedtypes,
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
2188 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2189 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2190 //printf("TemplateTypeParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2191 Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2192 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2193 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2194 Type *ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2195
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2196 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2197 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2198 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2199 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2200 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2201 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2202 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2203 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2204 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2205 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2206 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2207 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2208 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2209
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2210 ta = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2211 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2212 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2213 //printf("ta is %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2214
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2215 t = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2216
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2217 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2218 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2219 //printf("\tcalling deduceType(): ta is %s, specType is %s\n", ta->toChars(), specType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2220 MATCH m2 = ta->deduceType(sc, specType, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2221 if (m2 == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2222 { //printf("\tfailed deduceType\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2223 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2224 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2225
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2226 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2227 m = m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2228 t = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2229 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2230 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2231 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2232 // So that matches with specializations are better
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2233 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2234 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2235 { // Must match already deduced type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2236
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2237 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2238 if (!t->equals(ta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2239 { //printf("t = %s ta = %s\n", t->toChars(), ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2240 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2241 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2242 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2243 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2244
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2245 if (!t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2246 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2247 dedtypes->data[i] = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2248 t = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2249 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2250 *psparam = new AliasDeclaration(loc, ident, t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2251 //printf("\tm = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2252 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2253
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2254 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2255 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2256 //printf("\tm = %d\n", MATCHnomatch);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2257 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2258 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2259
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2260
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2261 void TemplateTypeParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2262 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2263 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2264
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2265 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2266 Type *ta = isType(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2267
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2268 assert(ta);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2269
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2270 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2271 printf("\tSpecialization: %s\n", specType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2272 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2273 printf("\tDefault: %s\n", defaultType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2274 printf("\tArgument: %s\n", t ? t->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2275 printf("\tDeduced Type: %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2276 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2277
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2278
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2279 void TemplateTypeParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2280 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2281 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2282 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2283 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2284 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2285 specType->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2286 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2287 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2288 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2289 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2290 defaultType->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2291 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2292 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2293
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2294
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2295 void *TemplateTypeParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2296 { Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2298 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2299 t = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2300 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2301 { // Use this for alias-parameter's too (?)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2302 t = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2303 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2304 return (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2305 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2306
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2307
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2308 Object *TemplateTypeParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2309 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2310 return specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2311 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2312
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2313
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2314 Object *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2315 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2316 Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2317
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2318 t = defaultType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2319 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2320 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2321 t = t->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2322 t = t->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2323 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2324 return t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2325 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2326
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2327 /* ======================== TemplateThisParameter =========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2328
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2329 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2330 // this-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2331
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2332 TemplateThisParameter::TemplateThisParameter(Loc loc, Identifier *ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2333 Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2334 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2335 : TemplateTypeParameter(loc, ident, specType, defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2336 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2337 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2338
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2339 TemplateThisParameter *TemplateThisParameter::isTemplateThisParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2340 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2341 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2342 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2343
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2344 TemplateParameter *TemplateThisParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2345 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2346 TemplateThisParameter *tp = new TemplateThisParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2347 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2348 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2349 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2350 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2351 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2352 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2353
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2354 void TemplateThisParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2355 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2356 buf->writestring("this ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2357 TemplateTypeParameter::toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2358 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2359 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2360
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2361 /* ======================== TemplateAliasParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2362
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2363 // alias-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2364
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2365 Dsymbol *TemplateAliasParameter::sdummy = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2366
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2367 TemplateAliasParameter::TemplateAliasParameter(Loc loc, Identifier *ident, Type *specAliasT, Type *defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2368 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2369 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2370 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2371 this->specAliasT = specAliasT;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2372 this->defaultAlias = defaultAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2373
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2374 this->specAlias = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2375 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2377 TemplateAliasParameter *TemplateAliasParameter::isTemplateAliasParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2378 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2379 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2380 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2381
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2382 TemplateParameter *TemplateAliasParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2383 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2384 TemplateAliasParameter *tp = new TemplateAliasParameter(loc, ident, specAliasT, defaultAlias);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2385 if (tp->specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2386 tp->specAliasT = specAliasT->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2387 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2388 tp->defaultAlias = defaultAlias->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2389 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2390 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2391
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2392 void TemplateAliasParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2393 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2394 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2395 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2396 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2397 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2398 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2399
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2400 void TemplateAliasParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2401 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2402 if (specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2403 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2404 specAlias = specAliasT->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2405 if (!specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2406 error(loc, "%s is not a symbol", specAliasT->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2407 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2408 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2409 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2410 defaultAlias = defaultAlias->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2411 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2412 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2413
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2414 int TemplateAliasParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2415 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2416 TemplateAliasParameter *tap = tp->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2417
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2418 if (tap)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2419 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2420 if (specAlias != tap->specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2421 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2422
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2423 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2424 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2425
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2426 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2427 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2428 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2429
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2430 MATCH TemplateAliasParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2431 Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes,
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
2432 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2433 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2434 Dsymbol *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2435 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2436 Expression *ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2437
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2438 //printf("TemplateAliasParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2439
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2440 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2441 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2442 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2443 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2444 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2445 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2446 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2447 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2448 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2449 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2450 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2451 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2452 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2453
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2454 sa = getDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2455 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2456 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2457
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2458 if (specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2459 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2460 if (!sa || sa == sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2461 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2462 if (sa != specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2463 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2464 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2465 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2466 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2467 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2468
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2469 if (!sa || s != sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2470 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2471 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2472 dedtypes->data[i] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2473
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2474 *psparam = new AliasDeclaration(loc, ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2475 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2476
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2477 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2478 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2479 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2480 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2481
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2482
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2483 void TemplateAliasParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2484 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2485 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2486
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2487 Dsymbol *sa = isDsymbol(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2488 assert(sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2489
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2490 printf("\tArgument alias: %s\n", sa->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2491 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2492
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2493 void TemplateAliasParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2494 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2495 buf->writestring("alias ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2496 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2497 if (specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2498 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2499 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2500 specAliasT->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2501 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2502 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2503 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2504 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2505 defaultAlias->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2506 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2507 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2508
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2509
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2510 void *TemplateAliasParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2511 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2512
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2513 s = specAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2514 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2515 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2516 if (!sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2517 sdummy = new Dsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2518 s = sdummy;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2519 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2520 return (void*)s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2521 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2522
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2523
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2524 Object *TemplateAliasParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2525 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2526 return specAliasT;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2527 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2528
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2529
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2530 Object *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2531 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2532 Dsymbol *s = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2533
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2534 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2535 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2536 s = defaultAlias->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2537 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2538 error("%s is not a symbol", defaultAlias->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2539 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2540 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2541 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2542
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2543 /* ======================== TemplateValueParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2544
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2545 // value-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2546
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2547 Expression *TemplateValueParameter::edummy = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2548
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2549 TemplateValueParameter::TemplateValueParameter(Loc loc, Identifier *ident, Type *valType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2550 Expression *specValue, Expression *defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2551 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2552 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2553 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2554 this->valType = valType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2555 this->specValue = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2556 this->defaultValue = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2557 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2558
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2559 TemplateValueParameter *TemplateValueParameter::isTemplateValueParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2560 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2561 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2562 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2563
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2564 TemplateParameter *TemplateValueParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2565 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2566 TemplateValueParameter *tp =
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2567 new TemplateValueParameter(loc, ident, valType, specValue, defaultValue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2568 tp->valType = valType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2569 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2570 tp->specValue = specValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2571 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2572 tp->defaultValue = defaultValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2573 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2574 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2575
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2576 void TemplateValueParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2577 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2578 VarDeclaration *v = new VarDeclaration(loc, valType, ident, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2579 v->storage_class = STCtemplateparameter;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2580 if (!sc->insert(v))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2581 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2582 sparam = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2583 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2584
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2585 void TemplateValueParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2586 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2587 sparam->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2588 valType = valType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2589 if (!(valType->isintegral() || valType->isfloating() || valType->isString()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2590 valType->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2591 error(loc, "arithmetic/string type expected for value-parameter, not %s", valType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2592
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2593 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2594 { Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2595
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2596 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2597 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2598 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2599 if (e->op == TOKint64 || e->op == TOKfloat64 ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2600 e->op == TOKcomplex80 || e->op == TOKnull || e->op == TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2601 specValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2602 //e->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2603 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2604
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2605 #if 0 // defer semantic analysis to arg match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2606 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2607 { Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2608
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2609 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2610 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2611 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2612 if (e->op == TOKint64)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2613 defaultValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2614 //e->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2615 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2616 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2617 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2618
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2619 int TemplateValueParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2620 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2621 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2622
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2623 if (tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2624 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2625 if (valType != tvp->valType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2626 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2627
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2628 if (valType && !valType->equals(tvp->valType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2629 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2630
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2631 if (specValue != tvp->specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2632 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2633
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2634 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2635 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2636
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2637 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2638 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2639 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2640
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2641
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2642 MATCH TemplateValueParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2643 Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes,
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
2644 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2645 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2646 //printf("TemplateValueParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2647
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2648 Initializer *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2649 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2650 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2651 Expression *ei;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2652 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2653
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2654 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2655 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2656 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2657 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2658 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2659 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2660 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2661 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2662 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2663 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2664 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2665 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2666 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2667
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2668 ei = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2669 Type *vt;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2670
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2671 if (!ei && oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2672 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2673
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2674 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2675 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2676 if (!ei || ei == edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2677 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2678
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2679 Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2680
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2681 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2682 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2683 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2684
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2685 ei = ei->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2686 ei = ei->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2687 ei = ei->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2688 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2689 //printf("e : %s, %s\n", e->toChars(), e->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2690 if (!ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2691 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2692 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2693 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2694 { // Must match already deduced value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2695 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2696
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2697 if (!ei || !ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2698 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2699 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2700 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2701 //printf("valType: %s, ty = %d\n", valType->toChars(), valType->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2702 vt = valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2703 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2704 if (ei->type)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2705 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2706 m = (MATCH)ei->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2707 //printf("m: %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2708 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2709 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2710 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2711 dedtypes->data[i] = ei;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2712
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2713 init = new ExpInitializer(loc, ei);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2714 sparam = new VarDeclaration(loc, vt, ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2715 sparam->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2716 *psparam = sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2717 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2718
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2719 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2720 //printf("\tno match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2721 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2722 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2723 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2724
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2725
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2726 void TemplateValueParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2727 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2728 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2729
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2730 Expression *ea = isExpression(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2731
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2732 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2733 printf("\tSpecialization: %s\n", specValue->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2734 printf("\tArgument Value: %s\n", ea ? ea->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2735 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2736
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2737
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2738 void TemplateValueParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2739 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2740 valType->toCBuffer(buf, ident, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2741 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2742 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2743 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2744 specValue->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2745 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2746 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2747 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2748 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2749 defaultValue->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2750 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2751 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2752
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2753
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2754 void *TemplateValueParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2755 { Expression *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2756
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2757 e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2758 if (!e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2759 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2760 // Create a dummy value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2761 if (!edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2762 edummy = valType->defaultInit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2763 e = edummy;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2764 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2765 return (void *)e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2766 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2767
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2768
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2769 Object *TemplateValueParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2770 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2771 return specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2772 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2773
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2774
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2775 Object *TemplateValueParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2776 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2777 Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2778 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2779 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2780 e = e->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2781 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2782 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2783 if (e->op == TOKdefault)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2784 { DefaultInitExp *de = (DefaultInitExp *)e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2785 e = de->resolve(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2786 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2787 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2788 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2789 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2790 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2791
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2792 /* ======================== TemplateTupleParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2793
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2794 // variadic-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2795
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2796 TemplateTupleParameter::TemplateTupleParameter(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2797 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2798 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2799 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2800 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2801
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2802 TemplateTupleParameter *TemplateTupleParameter::isTemplateTupleParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2803 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2804 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2805 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2806
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2807 TemplateParameter *TemplateTupleParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2808 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2809 TemplateTupleParameter *tp = new TemplateTupleParameter(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2810 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2811 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2812
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2813 void TemplateTupleParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2814 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2815 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2816 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2817 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2818 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2819 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2820
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2821 void TemplateTupleParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2822 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2823 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2824
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2825 int TemplateTupleParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2826 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2827 TemplateTupleParameter *tvp = tp->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2828
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2829 if (tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2830 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2831 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2832 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2833
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2834 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2835 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2836 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2837
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2838 MATCH TemplateTupleParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2839 Objects *tiargs, int i, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2840 Objects *dedtypes,
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
2841 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2842 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2843 //printf("TemplateTupleParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2844
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2845 /* The rest of the actual arguments (tiargs[]) form the match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2846 * for the variadic parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2847 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2848 assert(i + 1 == dedtypes->dim); // must be the last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2849 Tuple *ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2850 if (i + 1 == tiargs->dim && isTuple((Object *)tiargs->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2851 ovar = isTuple((Object *)tiargs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2852 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2853 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2854 ovar = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2855 //printf("ovar = %p\n", ovar);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2856 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2857 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2858 //printf("i = %d, tiargs->dim = %d\n", i, tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2859 ovar->objects.setDim(tiargs->dim - i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2860 for (size_t j = 0; j < ovar->objects.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2861 ovar->objects.data[j] = tiargs->data[i + j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2862 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2863 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2864 *psparam = new TupleDeclaration(loc, ident, &ovar->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2865 dedtypes->data[i] = (void *)ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2866 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2867 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2868
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2869
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2870 void TemplateTupleParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2871 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2872 printf(" %s... [", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2873 Tuple *v = isTuple(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2874 assert(v);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2875
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2876 //printf("|%d| ", v->objects.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2877 for (int i = 0; i < v->objects.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2878 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2879 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2880 printf(", ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2881
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2882 Object *o = (Object *)v->objects.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2883
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2884 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2885 if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2886 printf("alias: %s", sa->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2887
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2888 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2889 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2890 printf("type: %s", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2891
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2892 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2893 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2894 printf("exp: %s", ea->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2895
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2896 assert(!isTuple(o)); // no nested Tuple arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2897 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2898
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2899 printf("]\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2900 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2901
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2902 void TemplateTupleParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2903 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2904 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2905 buf->writestring("...");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2906 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2907
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2908
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2909 void *TemplateTupleParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2910 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2911 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2912 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2913
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2914
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2915 Object *TemplateTupleParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2916 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2917 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2918 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2919
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2920
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2921 Object *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2922 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2923 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2924 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2925
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2926 /* ======================== TemplateInstance ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2927
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2928 TemplateInstance::TemplateInstance(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2929 : ScopeDsymbol(NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2930 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2931 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2932 printf("TemplateInstance(this = %p, ident = '%s')\n", this, ident ? ident->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2933 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2934 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2935 this->name = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2936 this->tiargs = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2937 this->tempdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2938 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2939 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2940 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2941 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2942 this->semantictiargsdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2943 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2944 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2945 this->havetempdecl = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2946 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2947 this->errors = 0;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2949 // LDC
1067
7ce8355fbcc6 Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents: 948
diff changeset
2950 this->emittedInModule = NULL;
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2951 this->tinst = NULL;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2952 this->tmodule = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2953 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2954
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2955 /*****************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2956 * This constructor is only called when we figured out which function
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2957 * template to instantiate.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2958 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2959
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2960 TemplateInstance::TemplateInstance(Loc loc, TemplateDeclaration *td, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2961 : ScopeDsymbol(NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2962 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2963 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2964 printf("TemplateInstance(this = %p, tempdecl = '%s')\n", this, td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2965 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2966 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2967 this->name = td->ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2968 this->tiargs = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2969 this->tempdecl = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2970 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2971 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2972 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2973 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2974 this->semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2975 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2976 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2977 this->havetempdecl = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2978 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2979 this->errors = 0;
940
39519a1ff603 Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 876
diff changeset
2980
39519a1ff603 Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 876
diff changeset
2981 // LDC
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2982 this->tinst = NULL;
940
39519a1ff603 Changed the way LDC determines if a template instantiation needs to get a definition, seems to speed up compile times quite a bit in some cases.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 876
diff changeset
2983 this->tmodule = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2984
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2985 assert((size_t)tempdecl->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2986 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2987
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2988
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2989 Objects *TemplateInstance::arraySyntaxCopy(Objects *objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2990 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2991 Objects *a = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2992 if (objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2993 { a = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2994 a->setDim(objs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2995 for (size_t i = 0; i < objs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2996 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2997 Type *ta = isType((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2998 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2999 a->data[i] = ta->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3000 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3001 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3002 Expression *ea = isExpression((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3003 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3004 a->data[i] = ea->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3005 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3006 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3007 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3008 return a;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3009 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3010
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3011 Dsymbol *TemplateInstance::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3012 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3013 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3014
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3015 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3016 ti = (TemplateInstance *)s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3017 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3018 ti = new TemplateInstance(loc, name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3019
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3020 ti->tiargs = arraySyntaxCopy(tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3021
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3022 ScopeDsymbol::syntaxCopy(ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3023 return ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3024 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3025
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3026
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3027 void TemplateInstance::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3028 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3029 if (global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3030 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3031 if (!global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3032 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3033 /* Trying to soldier on rarely generates useful messages
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3034 * at this point.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3035 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3036 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3037 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3038 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3039 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3040 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3041 printf("\n+TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3042 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3043 if (inst) // if semantic() was already run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3044 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3045 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3046 printf("-TemplateInstance::semantic('%s', this=%p) already run\n", inst->toChars(), inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3047 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3048 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3049 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3050
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3051 if (semanticdone != 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3052 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3053 error(loc, "recursive template expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3054 // inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3055 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3056 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3057 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3058
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3059 // get the enclosing template instance from the scope tinst
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3060 tinst = sc->tinst;
946
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3061
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3062 // get the module of the outermost enclosing instantiation
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3063 if (tinst)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3064 tmodule = tinst->tmodule;
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3065 else
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3066 tmodule = sc->module;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
3067 //printf("%s in %s\n", toChars(), tmodule->toChars());
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3068
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3069 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3070 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3071 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3072 if (havetempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3073 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3074 assert((size_t)tempdecl->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3075 // Deduce tdtypes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3076 tdtypes.setDim(tempdecl->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3077 if (!tempdecl->matchWithInstance(this, &tdtypes, 0))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3078 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3079 error("incompatible arguments for template instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3080 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3081 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3082 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3083 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3084 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3085 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3086 /* Run semantic on each argument, place results in tiargs[]
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3087 * (if we havetempdecl, then tiargs is already evaluated)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3088 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3089 semanticTiargs(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3090
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3091 tempdecl = findTemplateDeclaration(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3092 if (tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3093 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3094 if (!tempdecl || global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3095 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3096 //printf("error return %p, %d\n", tempdecl, global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3097 return; // error recovery
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3098 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3099 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3100
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3101 hasNestedArgs(tiargs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3102
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3103 /* See if there is an existing TemplateInstantiation that already
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3104 * implements the typeargs. If so, just refer to that one instead.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3105 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3106
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3107 for (size_t i = 0; i < tempdecl->instances.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3108 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3109 TemplateInstance *ti = (TemplateInstance *)tempdecl->instances.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3110 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3111 printf("\t%s: checking for match with instance %d (%p): '%s'\n", toChars(), i, ti, ti->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3112 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3113 assert(tdtypes.dim == ti->tdtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3114
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3115 // Nesting must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3116 if (isnested != ti->isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3117 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3118 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3119 if (isnested && sc->parent != ti->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3120 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3121 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3122 for (size_t j = 0; j < tdtypes.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3123 { Object *o1 = (Object *)tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3124 Object *o2 = (Object *)ti->tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3125 if (!match(o1, o2, tempdecl, sc))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3126 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3127 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3128
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3129 // It's a match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3130 inst = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3131 parent = ti->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3132 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3133 printf("\tit's a match with instance %p\n", inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3134 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3135 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3136
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3137 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3138 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3139 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3140
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3141 /* So, we need to implement 'this' instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3142 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3143 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3144 printf("\timplement template instance '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3145 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3146 unsigned errorsave = global.errors;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3147 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3148 int tempdecl_instance_idx = tempdecl->instances.dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3149 tempdecl->instances.push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3150 parent = tempdecl->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3151 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3152
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3153 ident = genIdent(); // need an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3154
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3155 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3156 if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3157 parent = isnested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3158 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3159 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3160
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3161 // Add 'this' to the enclosing scope's members[] so the semantic routines
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3162 // will get called on the instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3163 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3164 int dosemantic3 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3165 { Array *a;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3166
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3167 Scope *scx = sc;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3168 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3169 for (scx = sc; scx; scx = scx->enclosing)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3170 if (scx->scopesym)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3171 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3172 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3173
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3174 //if (scx && scx->scopesym) printf("3: scx is %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3175 if (scx && scx->scopesym &&
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3176 scx->scopesym->members && !scx->scopesym->isTemplateMixin()
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3177 #if 1 // removed because it bloated compile times
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3178 /* The problem is if A imports B, and B imports A, and both A
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3179 * and B instantiate the same template, does the compilation of A
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3180 * or the compilation of B do the actual instantiation?
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3181 *
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3182 * see bugzilla 2500.
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3183 */
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3184 && !scx->module->selfImports()
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3185 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3186 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3187 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3188 //printf("\t1: adding to %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3189 a = scx->scopesym->members;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3190 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3191 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3192 { Module *m = sc->module->importedFrom;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3193 //printf("\t2: adding to module %s instead of module %s\n", m->toChars(), sc->module->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3194 a = m->members;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3195 if (m->semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3196 dosemantic3 = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3197 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3198 for (int i = 0; 1; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3199 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3200 if (i == a->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3201 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3202 a->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3203 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3204 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3205 if (this == (Dsymbol *)a->data[i]) // if already in Array
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3206 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3207 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3208 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3209 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3210
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3211 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3212 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3213
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3214 // Create our own scope for the template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3215 Scope *scope = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3216 if (!scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3217 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3218 error("forward reference to template declaration %s\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3219 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3220 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3221
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3222 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3223 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3224 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3225 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3226 argsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3227 scope = scope->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3228
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3229 // Declare each template parameter as an alias for the argument type
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3230 Scope *paramscope = scope->push();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3231 paramscope->stc = 0;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3232 declareParameters(paramscope);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3233 paramscope->pop();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3234
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3235 // Add members of template instance to template instance symbol table
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3236 // parent = scope->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3237 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3238 int memnum = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3239 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3240 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3241 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3242 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3243 printf("\t[%d] adding member '%s' %p kind %s to '%s', memnum = %d\n", i, s->toChars(), s, s->kind(), this->toChars(), memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3244 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3245 memnum |= s->addMember(scope, this, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3246 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3247 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3248 printf("adding members done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3249 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3250
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3251 /* See if there is only one member of template instance, and that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3252 * member has the same name as the template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3253 * If so, this template instance becomes an alias for that member.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3254 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3255 //printf("members->dim = %d\n", members->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3256 if (members->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3257 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3258 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3259 if (Dsymbol::oneMembers(members, &s) && s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3260 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3261 //printf("s->kind = '%s'\n", s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3262 //s->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3263 //printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3264 if (s->ident && s->ident->equals(tempdecl->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3265 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3266 //printf("setting aliasdecl\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3267 aliasdecl = new AliasDeclaration(loc, s->ident, s);
1089
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3268
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3269 // LDC propagate internal information
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3270 if (tempdecl->llvmInternal) {
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3271 s->llvmInternal = tempdecl->llvmInternal;
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3272 if (FuncDeclaration* fd = s->isFuncDeclaration()) {
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3273 fd->intrinsicName = tempdecl->intrinsicName;
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3274 }
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3275 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3276 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3277 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3278 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3279
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3280 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3281 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3282 printf("\tdo semantic() on template instance members '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3283 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3284 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3285 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3286 //printf("isnested = %d, sc->parent = %s\n", isnested, sc->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3287 sc2->parent = /*isnested ? sc->parent :*/ this;
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3288 sc2->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3289
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3290 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3291 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3292 __try
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3293 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3294 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3295 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3296 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3297 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3298 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3299 //printf("\t[%d] semantic on '%s' %p kind %s in '%s'\n", i, s->toChars(), s, s->kind(), this->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3300 //printf("test: isnested = %d, sc2->parent = %s\n", isnested, sc2->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3301 // if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3302 // s->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3303 //printf("test3: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3304 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3305 //printf("test4: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3306 sc2->module->runDeferredSemantic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3307 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3308 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3309 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3310 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3311 __except (__ehfilter(GetExceptionInformation()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3312 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3313 global.gag = 0; // ensure error message gets printed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3314 error("recursive expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3315 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3316 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3317 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3318 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3319
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3320 /* If any of the instantiation members didn't get semantic() run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3321 * on them due to forward references, we cannot run semantic2()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3322 * or semantic3() yet.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3323 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3324 for (size_t i = 0; i < Module::deferred.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3325 { Dsymbol *sd = (Dsymbol *)Module::deferred.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3326
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3327 if (sd->parent == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3328 goto Laftersemantic;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3329 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3330
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3331 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3332 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3333 * for initializers inside a function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3334 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3335 // if (sc->parent->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3337 /* BUG 782: this has problems if the classes this depends on
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3338 * are forward referenced. Find a way to defer semantic()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3339 * on this template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3340 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3341 semantic2(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3342
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3343 if (sc->func || dosemantic3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3344 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3345 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3346 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3347
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3348 Laftersemantic:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3349 sc2->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3350
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3351 scope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3352
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3353 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3354 if (global.errors != errorsave)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3355 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3356 error("error instantiating");
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3357 if(tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3358 tinst->printInstantiationTrace();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3359 errors = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3360 if (global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3361 tempdecl->instances.remove(tempdecl_instance_idx);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3362 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3363
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3364 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3365 printf("-TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3366 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3367 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3368
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3369
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3370 void TemplateInstance::semanticTiargs(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3371 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3372 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3373 if (semantictiargsdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3374 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3375 semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3376 semanticTiargs(loc, sc, tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3377 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3378
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3379 void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3380 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3381 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3382 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3383 if (!tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3384 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3385 for (size_t j = 0; j < tiargs->dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3386 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3387 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3388 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3389 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3390 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3391
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3392 //printf("1: tiargs->data[%d] = %p, %p, %p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3393 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3394 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3395 //printf("type %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3396 // It might really be an Expression or an Alias
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3397 ta->resolve(loc, sc, &ea, &ta, &sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3398 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3399 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3400 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3401 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3402 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3403 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3404 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3405 { tiargs->data[j] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3406 TupleDeclaration *d = sa->toAlias()->isTupleDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3407 if (d)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3408 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3409 size_t dim = d->objects->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3410 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3411 tiargs->insert(j, d->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3412 j--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3413 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3414 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3415 else if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3416 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3417 if (ta->ty == Ttuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3418 { // Expand tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3419 TypeTuple *tt = (TypeTuple *)ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3420 size_t dim = tt->arguments->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3421 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3422 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3423 { tiargs->reserve(dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3424 for (size_t i = 0; i < dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3425 { Argument *arg = (Argument *)tt->arguments->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3426 tiargs->insert(j + i, arg->type);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3427 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3428 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3429 j--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3430 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3431 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3432 tiargs->data[j] = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3434 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3435 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3436 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3437 tiargs->data[j] = Type::terror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3438 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3439 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3440 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3441 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3442 if (!ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3443 { assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3444 ea = new IntegerExp(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3445 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3446 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3447 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3448 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3449 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3450 if (ea->op == TOKtype)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3451 tiargs->data[j] = ea->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3452 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3453 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3454 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3455 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3456 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3457 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3458 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3460 //printf("1: tiargs->data[%d] = %p\n", j, tiargs->data[j]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3461 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3462 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3463 printf("-TemplateInstance::semanticTiargs('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3464 for (size_t j = 0; j < tiargs->dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3465 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3466 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3467 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3468 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3469 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3470 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3471
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3472 printf("\ttiargs[%d] = ta %p, ea %p, sa %p, va %p\n", j, ta, ea, sa, va);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3473 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3474 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3475 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3476
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3477 /**********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3478 * Find template declaration corresponding to template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3479 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3480
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3481 TemplateDeclaration *TemplateInstance::findTemplateDeclaration(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3482 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3483 //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3484 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3485 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3486 /* Given:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3487 * foo!( ... )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3488 * figure out which TemplateDeclaration foo refers to.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3489 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3490 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3491 Dsymbol *scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3492 Identifier *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3493 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3494
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3495 id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3496 s = sc->search(loc, id, &scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3497 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3498 { error("identifier '%s' is not defined", id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3499 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3500 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3501 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3502 printf("It's an instance of '%s' kind '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3503 if (s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3504 printf("s->parent = '%s'\n", s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3505 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3506 withsym = scopesym->isWithScopeSymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3507
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3508 /* We might have found an alias within a template when
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3509 * we really want the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3510 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3511 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3512 if (s->parent &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3513 (ti = s->parent->isTemplateInstance()) != NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3514 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3515 if (
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3516 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3517 ti->toAlias()->ident == id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3518 &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3519 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3520 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3521 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3522 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3523 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3524 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3525 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3526 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3527 tempdecl = tempdecl->overroot; // then get the start
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3528 s = tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3529 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3530 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3531
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3532 s = s->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3533
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3534 /* It should be a TemplateDeclaration, not some other symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3535 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3536 tempdecl = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3537 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3538 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3539 if (!s->parent && global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3540 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3541 if (!s->parent && s->getType())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3542 { Dsymbol *s2 = s->getType()->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3543 if (!s2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3544 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3545 error("%s is not a template declaration, it is a %s", id->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3546 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3547 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3548 s = s2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3549 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3550 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3551 //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3552 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3553 //assert(s->parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3554 TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3555 if (ti &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3556 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3557 ti->toAlias()->ident == id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3558 &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3559 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3560 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3561 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3562 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3563 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3564 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3565 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3566 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3567 tempdecl = tempdecl->overroot; // then get the start
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3568 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3569 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3570 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3571 error("%s is not a template declaration, it is a %s", id->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3572 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3573 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3574 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3575 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3576 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3577 assert(tempdecl->isTemplateDeclaration());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3578 return tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3579 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3580
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3581 TemplateDeclaration *TemplateInstance::findBestMatch(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3582 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3583 /* Since there can be multiple TemplateDeclaration's with the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3584 * name, look for the best match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3585 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3586 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3587 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3588 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3589 Objects dedtypes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3591 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3592 printf("TemplateInstance::findBestMatch()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3593 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3594 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3595 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3596 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3597
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3598 //if (tiargs->dim) printf("2: tiargs->dim = %d, data[0] = %p\n", tiargs->dim, tiargs->data[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3599
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3600 // If more arguments than parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3601 // then this is no match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3602 if (td->parameters->dim < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3603 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3604 if (!td->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3605 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3606 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3607
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3608 dedtypes.setDim(td->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3609 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3610 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3611 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3612 error("forward reference to template declaration %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3613 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3614 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3615 m = td->matchWithInstance(this, &dedtypes, 0);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3616 //printf("matchWithInstance = %d\n", m);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3617 if (!m) // no match at all
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3618 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3619
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3620 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3621 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3622 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3623 goto Ltd;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3624
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3625 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3626 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3627 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3628 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3629 //printf("c1 = %d, c2 = %d\n", c1, c2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3630
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3631 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3632 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3633 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3634 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3635 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3636 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3637 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3638
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3639 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3640 td_ambig = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3641 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3642
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3643 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3644 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3645 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3646
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3647 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3648 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3649 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3650 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3651 tdtypes.setDim(dedtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3652 memcpy(tdtypes.data, dedtypes.data, tdtypes.dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3653 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3654 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3655
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3656 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3657 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3658 error("%s does not match any template declaration", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3659 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3660 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3661 if (td_ambig)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3662 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3663 error("%s matches more than one template declaration, %s and %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3664 toChars(), td_best->toChars(), td_ambig->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3665 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3666
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3667 /* The best match is td_best
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3668 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3669 tempdecl = td_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3670
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3671 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3672 /* Cast any value arguments to be same type as value parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3673 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3674 for (size_t i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3675 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3676 Expression *ea = isExpression(o); // value argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3677 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3678 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3679 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3680 if (tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3681 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3682 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3683 ea = ea->castTo(tvp->valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3684 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3685 tiargs->data[i] = (Object *)ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3686 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3687 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3688 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3689
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3690 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3691 printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3692 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3693 return tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3694 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3695
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3696
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3697 /*****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3698 * Determines if a TemplateInstance will need a nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3699 * generation of the TemplateDeclaration.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3700 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3701
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3702 int TemplateInstance::hasNestedArgs(Objects *args)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3703 { int nested = 0;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3704 //printf("TemplateInstance::hasNestedArgs('%s')\n", tempdecl->ident->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3705
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3706 /* A nested instance happens when an argument references a local
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3707 * symbol that is on the stack.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3708 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3709 for (size_t i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3710 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3711 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3712 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3713 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3714 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3715 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3716 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3717 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3718 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3719 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3720 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3721 if (ea->op == TOKfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3722 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3723 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3724 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3725 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3726 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3727 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3728 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3729 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3730 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3731 if (d && !d->isDataseg() &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3732 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3733 !(d->storage_class & STCmanifest) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3734 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3735 (!d->isFuncDeclaration() || d->isFuncDeclaration()->isNested()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3736 !isTemplateMixin())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3737 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3738 // if module level template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3739 if (tempdecl->toParent()->isModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3740 { Dsymbol *dparent = d->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3741 if (!isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3742 isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3743 else if (isnested != dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3744 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3745 /* Select the more deeply nested of the two.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3746 * Error if one is not nested inside the other.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3747 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3748 for (Dsymbol *p = isnested; p; p = p->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3749 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3750 if (p == dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3751 goto L1; // isnested is most nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3752 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3753 for (Dsymbol *p = dparent; p; p = p->parent)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3754 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3755 if (p == isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3756 { isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3757 goto L1; // dparent is most nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3758 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3759 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3760 error("%s is nested in both %s and %s",
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3761 toChars(), isnested->toChars(), dparent->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3762 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3763 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3764 //printf("\tnested inside %s\n", isnested->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3765 nested |= 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3766 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3767 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3768 error("cannot use local '%s' as template parameter", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3769 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3770 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3771 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3772 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3773 nested |= hasNestedArgs(&va->objects);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3774 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3775 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3776 return nested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3777 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3778
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3779 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3780 * This instance needs an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3781 * Create one by taking the template declaration name and adding
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3782 * the type signature for it.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3783 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3784
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3785 Identifier *TemplateInstance::genIdent()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3786 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3787 char *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3788 Objects *args;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3789
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3790 //printf("TemplateInstance::genIdent('%s')\n", tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3791 id = tempdecl->ident->toChars();
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3792 buf.printf("__T%zu%s", strlen(id), id);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3793 args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3794 for (int i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3795 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3796 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3797 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3798 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3799 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3800 //printf("\to %p ta %p ea %p sa %p va %p\n", o, ta, ea, sa, va);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3801 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3802 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3803 buf.writeByte('T');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3804 if (ta->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3805 buf.writestring(ta->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3806 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3807 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3808 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3809 printf("ta = %d, %s\n", ta->ty, ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3810 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3811 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3812 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3813 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3814 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3815 { sinteger_t v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3816 real_t r;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3817
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3818 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3819 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3820 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3821 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3822 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3823 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3824 if (ea->op == TOKfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3825 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3826 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3827 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3828 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3829 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3830 buf.writeByte('V');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3831 if (ea->op == TOKtuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3832 { ea->error("tuple is not a valid template value argument");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3833 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3834 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3835 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3836 /* Use deco that matches what it would be for a function parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3837 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3838 buf.writestring(ea->type->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3839 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3840 // Use type of parameter, not type of argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3841 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3842 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3843 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3844 assert(tvp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3845 buf.writestring(tvp->valType->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3846 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3847 ea->toMangleBuffer(&buf);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3848 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3849 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3850 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3851 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3852 buf.writeByte('S');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3853 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3854 if (d && !d->type->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3855 error("forward reference of %s", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3856 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3857 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3858 char *p = sa->mangle();
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3859 buf.printf("%zu%s", strlen(p), p);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3860 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3861 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3862 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3863 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3864 assert(i + 1 == args->dim); // must be last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3865 args = &va->objects;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3866 i = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3867 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3868 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3869 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3870 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3871 buf.writeByte('Z');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3872 id = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3873 buf.data = NULL;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3874 //printf("\tgenIdent = %s\n", id);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3875 return new Identifier(id, TOKidentifier);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3876 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3877
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3878
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3879 /****************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3880 * Declare parameters of template instance, initialize them with the
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3881 * template instance arguments.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3882 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3883
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3884 void TemplateInstance::declareParameters(Scope *scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3885 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3886 //printf("TemplateInstance::declareParameters()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3887 for (int i = 0; i < tdtypes.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3888 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3889 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3890 //Object *o = (Object *)tiargs->data[i];
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3891 Object *o = (Object *)tdtypes.data[i]; // initializer for tp
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3892
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3893 //printf("\ttdtypes[%d] = %p\n", i, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3894 tempdecl->declareParameter(scope, tp, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3895 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3896 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3897
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3898
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3899 void TemplateInstance::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3900 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3901
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3902 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3903 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3904 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3905 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3906 printf("+TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3907 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3908 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3909 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3910 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3911 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3912 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3913 sc = sc->push(this);
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3914 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3915 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3916 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3917 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3918 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3919 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3920 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3921 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3922 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3923 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3924 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3925 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3926 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3927 printf("-TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3928 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3929 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3930
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3931 void TemplateInstance::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3932 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3933 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3934 printf("TemplateInstance::semantic3('%s'), semanticdone = %d\n", toChars(), semanticdone);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3935 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3936 //if (toChars()[0] == 'D') *(char*)0=0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3937 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3938 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3939 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3940 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3941 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3942 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3943 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3944 sc = sc->push(this);
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3945 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3946 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3947 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3948 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3949 s->semantic3(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3950 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3951 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3952 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3953 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3954 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3955
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3956 void TemplateInstance::toObjFile(int multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3957 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3958 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3959 printf("TemplateInstance::toObjFile('%s', this = %p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3960 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3961 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3962 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3963 if (multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3964 // Append to list of object files to be written later
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3965 //obj_append(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3966 assert(0 && "multiobj");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3967 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3968 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3969 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3970 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3971 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3972 s->toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3973 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3974 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3975 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3976 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3977
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3978 void TemplateInstance::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3979 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3980 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3981 printf("TemplateInstance::inlineScan('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3982 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3983 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3984 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3985 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3986 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3987 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3988 s->inlineScan();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3989 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3990 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3991 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3992
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3993 void TemplateInstance::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3994 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3995 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3996
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3997 Identifier *id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3998 buf->writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3999 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4000 if (nest)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4001 buf->writestring("...");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4002 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4003 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4004 nest++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4005 Objects *args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4006 for (i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4007 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4008 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4009 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4010 Object *oarg = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4011 ObjectToCBuffer(buf, hgs, oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4012 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4013 nest--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4014 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4015 buf->writeByte(')');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4016 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4017
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4018
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4019 Dsymbol *TemplateInstance::toAlias()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4020 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4021 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4022 printf("TemplateInstance::toAlias()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4023 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4024 if (!inst)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4025 { error("cannot resolve forward reference");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4026 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4027 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4028
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4029 if (inst != this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4030 return inst->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4031
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4032 if (aliasdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4033 return aliasdecl->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4034
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4035 return inst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4036 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4037
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4038 AliasDeclaration *TemplateInstance::isAliasDeclaration()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4039 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4040 return aliasdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4041 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4042
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4043 const char *TemplateInstance::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4044 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4045 return "template instance";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4046 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4047
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4048 int TemplateInstance::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4049 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4050 *ps = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4051 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4052 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4053
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4054 char *TemplateInstance::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4055 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4056 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4057 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4058 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4059
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4060 toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4061 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4062 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4063 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4064 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4065
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4066 void TemplateInstance::printInstantiationTrace()
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4067 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4068 if(global.gag)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4069 return;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4070
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4071 const int max_shown = 6;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4072
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4073 // determine instantiation depth
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4074 int n_instantiations = 1;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4075 TemplateInstance* cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4076 while(cur = cur->tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4077 ++n_instantiations;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4078
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4079 // show full trace only if it's short or verbose is on
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4080 if(n_instantiations <= max_shown || global.params.verbose)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4081 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4082 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4083 while(cur)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4084 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4085 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars());
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4086 cur = cur->tinst;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4087 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4088 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4089 else
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4090 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4091 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4092 size_t i = 0;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4093 for(; i < max_shown/2; ++i, cur = cur->tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4094 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars());
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4095 fprintf(stdmsg," ... (%d instantiations, -v to show) ...\n", n_instantiations - max_shown);
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4096 for(; i < n_instantiations - max_shown + max_shown/2; ++i, cur = cur->tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4097 {}
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4098 for(; i < n_instantiations; ++i, cur = cur->tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4099 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars());
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4100 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4101 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4102
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4103 /* ======================== TemplateMixin ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4104
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4105 TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, Type *tqual,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4106 Array *idents, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4107 : TemplateInstance(loc, (Identifier *)idents->data[idents->dim - 1])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4108 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4109 //printf("TemplateMixin(ident = '%s')\n", ident ? ident->toChars() : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4110 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4111 this->tqual = tqual;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4112 this->idents = idents;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4113 this->tiargs = tiargs ? tiargs : new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4114 this->scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4115 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4116
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4117 Dsymbol *TemplateMixin::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4118 { TemplateMixin *tm;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4119
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4120 Array *ids = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4121 ids->setDim(idents->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4122 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4123 { // Matches TypeQualified::syntaxCopyHelper()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4124 Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4125 if (id->dyncast() == DYNCAST_DSYMBOL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4126 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4127 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4128
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4129 ti = (TemplateInstance *)ti->syntaxCopy(NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4130 id = (Identifier *)ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4131 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4132 ids->data[i] = id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4133 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4134
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4135 tm = new TemplateMixin(loc, ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4136 (Type *)(tqual ? tqual->syntaxCopy() : NULL),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4137 ids, tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4138 TemplateInstance::syntaxCopy(tm);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4139 return tm;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4140 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4141
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4142 void TemplateMixin::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4143 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4144 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4145 printf("+TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4146 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4147 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4148 if (semanticdone &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4149 // This for when a class/struct contains mixin members, and
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4150 // is done over because of forward references
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4151 (!parent || !toParent()->isAggregateDeclaration()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4152 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4153 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4154 printf("\tsemantic done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4155 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4156 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4157 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4158 if (!semanticdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4159 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4160 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4161 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4162 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4163
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4164 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4165 // dont know what this is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4166 util_progress();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4167 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4169 Scope *scx = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4170 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4171 { sc = scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4172 scx = scope; // save so we don't make redundant copies
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4173 scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4174 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4175
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4176 // Follow qualifications to find the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4177 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4178 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4179 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4180 Identifier *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4181
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4182 if (tqual)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4183 { s = tqual->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4184 i = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4185 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4186 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4187 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4188 i = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4189 id = (Identifier *)idents->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4190 switch (id->dyncast())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4191 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4192 case DYNCAST_IDENTIFIER:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4193 s = sc->search(loc, id, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4194 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4195
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4196 case DYNCAST_DSYMBOL:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4197 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4198 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4199 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4200 s = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4201 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4202 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4203 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4204 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4205 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4206 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4207
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4208 for (; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4209 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4210 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4211 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4212 id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4213 s = s->searchX(loc, sc, id);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4214 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4215 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4216 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4217 error("is not defined");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4218 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4219 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4220 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4221 tempdecl = s->toAlias()->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4222 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4223 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4224 error("%s isn't a template", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4225 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4226 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4227 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4228 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4229
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4230 // Look for forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4231 assert(tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4232 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4233 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4234 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4235 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4236 /* Cannot handle forward references if mixin is a struct member,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4237 * because addField must happen during struct's semantic, not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4238 * during the mixin semantic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4239 * runDeferred will re-run mixin's semantic outside of the struct's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4240 * semantic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4241 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4242 semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4243 AggregateDeclaration *ad = toParent()->isAggregateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4244 if (ad)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4245 ad->sizeok = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4246 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4247 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4248 // Forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4249 //printf("forward reference - deferring\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4250 scope = scx ? scx : new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4251 scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4252 scope->module->addDeferredSemantic(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4253 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4254 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4255 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4256 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4257
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4258 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4259 semanticTiargs(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4260
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4261 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4262 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4263 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4264 return; // error recovery
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4265 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4267 if (!ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4268 ident = genIdent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4269
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4270 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4271 parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4272
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4273 /* Detect recursive mixin instantiations.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4274 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4275 for (Dsymbol *s = parent; s; s = s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4276 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4277 //printf("\ts = '%s'\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4278 TemplateMixin *tm = s->isTemplateMixin();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4279 if (!tm || tempdecl != tm->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4280 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4282 /* Different argument list lengths happen with variadic args
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4283 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4284 if (tiargs->dim != tm->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4285 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4286
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4287 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4288 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4289 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4290 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4291 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4292 Object *tmo = (Object *)tm->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4293 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4294 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4295 Type *tmta = isType(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4296 if (!tmta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4297 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4298 if (!ta->equals(tmta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4299 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4300 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4301 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4302 { Expression *tme = isExpression(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4303 if (!tme || !ea->equals(tme))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4304 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4305 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4306 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4307 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4308 Dsymbol *tmsa = isDsymbol(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4309 if (sa != tmsa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4310 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4311 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4312 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4313 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4314 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4315 error("recursive mixin instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4316 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4317
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4318 Lcontinue:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4319 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4320 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4321
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4322 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4323 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4324 if (!members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4325 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4326
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4327 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4328
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4329 for (Scope *sce = sc; 1; sce = sce->enclosing)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4330 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4331 ScopeDsymbol *sds = (ScopeDsymbol *)sce->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4332 if (sds)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4333 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4334 sds->importScope(this, PROTpublic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4335 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4336 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4337 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4338
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4339 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4340 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4341 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4342 Scope *scy = sc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4343 scy = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4344 scy->parent = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4345
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4346 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4347 argsym->parent = scy->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4348 Scope *scope = scy->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4349
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4350 unsigned errorsave = global.errors;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4351
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4352 // Declare each template parameter as an alias for the argument type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4353 declareParameters(scope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4354
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4355 // Add members to enclosing scope, as well as this scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4356 for (unsigned i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4357 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4358
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4359 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4360 s->addMember(scope, this, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4361 //sc->insert(s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4362 //printf("sc->parent = %p, sc->scopesym = %p\n", sc->parent, sc->scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4363 //printf("s->parent = %s\n", s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4364 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4365
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4366 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4367 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4368 printf("\tdo semantic() on template instance members '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4369 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4370 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4371 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4372 sc2->offset = sc->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4373 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4374 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4375 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4376 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4377 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4378 sc->offset = sc2->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4379
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4380 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4381 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4382 * for initializers inside a function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4383 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4384 // if (sc->parent->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4385
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4386 semantic2(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4387
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4388 if (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4389 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4390 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4391 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4392
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4393 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4394 if (global.errors != errorsave)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4395 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4396 error("error instantiating");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4397 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4398
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4399 sc2->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4400
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4401 scope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4402
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4403 // if (!isAnonymous())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4404 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4405 scy->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4406 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4407 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4408 printf("-TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4409 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4410 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4411
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4412 void TemplateMixin::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4413 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4414
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4415 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4416 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4417 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4418 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4419 printf("+TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4420 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4421 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4422 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4423 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4424 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4425 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4426 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4427 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4428 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4429 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4430 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4431 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4432 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4434 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4435 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4436 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4437 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4438 printf("-TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4439 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4440 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4441
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4442 void TemplateMixin::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4443 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4444
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4445 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4446 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4447 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4448 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4449 printf("TemplateMixin::semantic3('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4450 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4451 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4452 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4453 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4454 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4455 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4456 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4457 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4458 s->semantic3(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4460 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4461 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4462 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4463 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4464
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4465 void TemplateMixin::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4466 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4467 TemplateInstance::inlineScan();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4468 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4469
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4470 const char *TemplateMixin::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4471 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4472 return "mixin";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4473 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4474
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4475 int TemplateMixin::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4476 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4477 return Dsymbol::oneMember(ps);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4478 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4479
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4480 int TemplateMixin::hasPointers()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4481 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4482 //printf("TemplateMixin::hasPointers() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4483 for (size_t i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4484 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4485 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4486 //printf(" s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4487 if (s->hasPointers())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4488 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4489 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4490 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4491 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4492 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4493 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4494
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4495 char *TemplateMixin::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4496 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4497 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4498 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4499 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4500
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4501 TemplateInstance::toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4502 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4503 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4504 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4505 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4506
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4507 void TemplateMixin::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4508 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4509 buf->writestring("mixin ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4510
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4511 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4512 { Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4513
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4514 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4515 buf->writeByte('.');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4516 buf->writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4517 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4518 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4519 if (tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4520 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4521 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4522 { if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4523 buf->writebyte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4524 Object *oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4525 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4526 Expression *e = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4527 Dsymbol *s = isDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4528 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4529 t->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4530 else if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4531 e->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4532 else if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4533 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4534 char *p = s->ident ? s->ident->toChars() : s->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4535 buf->writestring(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4536 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4537 else if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4538 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4539 buf->writestring("NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4540 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4541 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4542 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4543 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4544 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4545 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4546 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4547 buf->writebyte(')');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4548 if (ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4549 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4550 buf->writebyte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4551 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4552 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4553 buf->writebyte(';');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4554 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4555 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4556
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4557
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4558 void TemplateMixin::toObjFile(int multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4559 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4560 //printf("TemplateMixin::toObjFile('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4561 TemplateInstance::toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4562 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4563