annotate dmd/template.c @ 1168:ab186e535e72

A different fix to #218 and DMD2682 that does not lead to constant folding regressions. Fixes run/const_15, run/c/const_16_B. The price is removing the lvalueness of struct literals. If it turns out too much code depends on this behavior or we don't want to break with DMD, we could keep struct literals as lvalues and instead convert struct literals used as expression initializers into struct initializers.
author Christian Kamm <kamm incasoftware de>
date Sun, 29 Mar 2009 11:43:45 +0200
parents dbe4af57b240
children 0b26cfb2d445
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);
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
340
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
341 #if IN_LLVM
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 561
diff changeset
342 // LDC
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
343 td->intrinsicName = intrinsicName;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
344 #endif
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
345
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
346 return td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
347 }
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 void TemplateDeclaration::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
350 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
351 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
352 printf("TemplateDeclaration::semantic(this = %p, id = '%s')\n", this, ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
353 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
354 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
355 return; // semantic() already run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
356
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
357 if (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
358 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
359 #if DMDV1
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
360 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
361 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
362 }
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 if (/*global.params.useArrayBounds &&*/ sc->module)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
365 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
366 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
367 // when template is instantiated in other modules
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
368
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
369 // FIXME: LDC
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
370 //sc->module->toModuleArray();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
371 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
372
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
373 if (/*global.params.useAssert &&*/ sc->module)
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 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
376 // when template is instantiated in other modules
1146
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
377
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
378 // FIXME: LDC
1860414bf3b7 * Moved ir/irsymbol.cpp/h into ir/irdsymbol.cpp/h.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
379 //sc->module->toModuleAssert();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
380 }
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 /* Remember Scope for later instantiations, but make
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
383 * a copy since attributes can change.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
384 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
385 this->scope = new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
386 this->scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
387
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
388 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
389 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
390 paramsym->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
391 Scope *paramscope = sc->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
392 paramscope->parameterSpecialization = 1;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
393 paramscope->stc = 0;
336
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 if (global.params.doDocComments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
396 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
397 origParameters = new TemplateParameters();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
398 origParameters->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
399 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
400 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
401 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
402 origParameters->data[i] = (void *)tp->syntaxCopy();
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 }
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 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
407 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
408 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
409
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
410 tp->declareParameter(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
411 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
412
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
413 for (int i = 0; i < parameters->dim; i++)
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 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
416
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
417 tp->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
418 if (i + 1 != parameters->dim && tp->isTemplateTupleParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
419 error("template tuple parameter must be last one");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
420 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
421
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
422 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
423
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
424 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
425 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
426 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
427 if (Dsymbol::oneMembers(members, &s))
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 if (s && s->ident && s->ident->equals(ident))
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 onemember = s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
432 s->parent = this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
437 /* BUG: should check:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
438 * o no virtual functions or non-static data members of classes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
439 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
440 }
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 const char *TemplateDeclaration::kind()
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 return (onemember && onemember->isAggregateDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
445 ? onemember->kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
446 : (char *)"template";
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
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 * Overload existing TemplateDeclaration 'this' with the new one 's'.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
451 * Return !=0 if successful; i.e. no conflict.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
454 int TemplateDeclaration::overloadInsert(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
455 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
456 TemplateDeclaration **pf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
457 TemplateDeclaration *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
458
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
459 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
460 printf("TemplateDeclaration::overloadInsert('%s')\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
461 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
462 f = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
463 if (!f)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
464 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
465 TemplateDeclaration *pthis = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
466 for (pf = &pthis; *pf; pf = &(*pf)->overnext)
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 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
469 // Conflict if TemplateParameter's match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
470 // Will get caught anyway later with TemplateInstance, but
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
471 // should check it now.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
472 TemplateDeclaration *f2 = *pf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
473
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
474 if (f->parameters->dim != f2->parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
475 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
476
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
477 for (int i = 0; i < f->parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
478 { TemplateParameter *p1 = (TemplateParameter *)f->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
479 TemplateParameter *p2 = (TemplateParameter *)f2->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
480
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
481 if (!p1->overloadMatch(p2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
482 goto Lcontinue;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
485 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
486 printf("\tfalse: conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
487 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
488 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
489
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
490 Lcontinue:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
491 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
492 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
493 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
494
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
495 f->overroot = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
496 *pf = f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
497 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
498 printf("\ttrue: no conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
499 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
500 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
501 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
502
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
503 /***************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
504 * Given that ti is an instance of this TemplateDeclaration,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
505 * deduce the types of the parameters to this, and store
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
506 * those deduced types in dedtypes[].
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
507 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
508 * flag 1: don't do semantic() because of dummy types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
509 * 2: don't change types in matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
510 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
511 * dedtypes deduced arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
512 * Return match level.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
515 MATCH TemplateDeclaration::matchWithInstance(TemplateInstance *ti,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
516 Objects *dedtypes, int flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
517 { MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
518 int dedtypes_dim = dedtypes->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
519
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
520 #define LOGM 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
521 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
522 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
523 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
524
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
525 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
526 printf("dedtypes->dim = %d, parameters->dim = %d\n", dedtypes_dim, parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
527 if (ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
528 printf("ti->tiargs->dim = %d, [0] = %p\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
529 ti->tiargs->dim,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
530 ti->tiargs->data[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
531 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
532 dedtypes->zero();
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 int parameters_dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
535 int variadic = isVariadic() != NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
536
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
537 // If more arguments than parameters, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
538 if (ti->tiargs->dim > parameters_dim && !variadic)
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 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
541 printf(" no match: more arguments than parameters\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
542 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
543 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
544 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
545
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
546 assert(dedtypes_dim == parameters_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
547 assert(dedtypes_dim >= ti->tiargs->dim || variadic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
548
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
549 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
550 assert((size_t)scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
551 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
552 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
553 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
554 paramscope->stc = 0;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
555
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
556 // Attempt type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
557 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
558 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
559 { MATCH m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
560 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
561 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
562
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
563 //printf("\targument [%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
564 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
565 //printf("\targument [%d] is %s\n", i, oarg ? oarg->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
566 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
567 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
568 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
569 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
570
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
571 #if DMDV1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
572 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
573 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
574 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
575
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
576 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
577 //printf("\tm2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
578
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
579 if (m2 == MATCHnomatch)
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 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
582 printf("\tmatchArg() for parameter %i failed\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
583 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
584 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
585 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
586
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
587 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
588 m = m2;
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 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
592 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
593 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
594 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
595
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
596 if (!flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
597 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
598 /* 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
599 * its corresponding arg
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
600 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
601 for (int i = 0; i < dedtypes_dim; i++)
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 if (!dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
604 { assert(i < ti->tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
605 dedtypes->data[i] = ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
606 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
607 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
608 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
609
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
610 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
611 if (m && constraint && !(flag & 1))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
612 { /* Check to see if constraint is satisfied.
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 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
615 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
616 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
617 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
618 if (e->isBool(TRUE))
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 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
621 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
622 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
623 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
624 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
625 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
626 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
627 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
628
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
629 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
630 // Print out the results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
631 printf("--------------------------\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
632 printf("template %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
633 printf("instance %s\n", ti->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
634 if (m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
635 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
636 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
637 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
638 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
639 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
640
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
641 printf(" [%d]", 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 if (i < ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
644 oarg = (Object *)ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
645 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
646 oarg = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
647 tp->print(oarg, (Object *)dedtypes->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
648 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
649 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
650 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
651 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
652 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
653
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(" match = %d\n", m);
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 goto Lret;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
660 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
661 printf(" no match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
662 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
663 m = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
664
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
665 Lret:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
666 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
667 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
668 printf("-TemplateDeclaration::matchWithInstance(this = %p, ti = %p) = %d\n", this, ti, m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
669 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
670 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
671 }
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 * Determine partial specialization order of 'this' vs td2.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
675 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
676 * 1 this is at least as specialized as td2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
677 * 0 td2 is more specialized than this
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
678 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
679
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
680 int TemplateDeclaration::leastAsSpecialized(TemplateDeclaration *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 /* This works by taking the template parameters to this template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
683 * declaration and feeding them to td2 as if it were a template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
684 * instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
685 * If it works, then this template is at least as specialized
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
686 * as td2.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
689 TemplateInstance ti(0, ident); // create dummy template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
690 Objects dedtypes;
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 #define LOG_LEASTAS 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
693
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
695 printf("%s.leastAsSpecialized(%s)\n", toChars(), td2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
696 #endif
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 // Set type arguments to dummy template instance to be types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
699 // generated from the parameters to this template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
700 ti.tiargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
701 ti.tiargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
702 for (int i = 0; i < ti.tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
703 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
704 TemplateParameter *tp = (TemplateParameter *)parameters->data[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 void *p = tp->dummyArg();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
707 if (p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
708 ti.tiargs->data[i] = p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
709 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
710 ti.tiargs->setDim(i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
711 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
712
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
713 // Temporary Array to hold deduced types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
714 //dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
715 dedtypes.setDim(td2->parameters->dim);
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 // Attempt a type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
718 if (td2->matchWithInstance(&ti, &dedtypes, 1))
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 /* A non-variadic template is more specialized than a
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
721 * variadic one.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
722 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
723 if (isVariadic() && !td2->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
724 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
725
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(" matches, so is least 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 1;
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 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
732 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
733 printf(" doesn't match, so is not as specialized\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
734 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
735 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
736 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
737
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
738
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
739 /*************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
740 * Match function arguments against a specific template function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
741 * Input:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
742 * loc instantiation location
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
743 * 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
744 * ethis 'this' argument if !NULL
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
745 * fargs arguments to function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
746 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
747 * dedargs Expression/Type deduced template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
748 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
749 * match level
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
750 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
751
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
752 MATCH TemplateDeclaration::deduceFunctionTemplateMatch(Loc loc, Objects *targsi,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
753 Expression *ethis, Expressions *fargs,
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
754 Objects *dedargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
755 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
756 size_t i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
757 size_t nfparams;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
758 size_t nfargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
759 size_t nargsi; // array size of targsi
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
760 int fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
761 int tuple_dim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
762 MATCH match = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
763 FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
764 TypeFunction *fdtype; // type of fd
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
765 TemplateTupleParameter *tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
766 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
767
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
768 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
769 printf("\nTemplateDeclaration::deduceFunctionTemplateMatch() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
770 for (i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
771 { Expression *e = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
772 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
773 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
774 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
775
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
776 assert((size_t)scope > 0x10000);
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 dedargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
779 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
780
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
781 dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
782 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
783
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
784 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
785 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
786 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
787 Scope *paramscope = scope->push(paramsym);
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 tp = isVariadic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
790
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
791 nargsi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
792 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
793 { // Set initial template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
794
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
795 nargsi = targsi->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
796 if (nargsi > parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
797 { if (!tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
798 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
799 dedargs->setDim(nargsi);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
800 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
801 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
802
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
803 memcpy(dedargs->data, targsi->data, nargsi * sizeof(*dedargs->data));
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 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
806 { assert(i < parameters->dim);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
807 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
808 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
809 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
810
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
811 m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
812 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
813 if (m == MATCHnomatch)
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 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
816 match = m;
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 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
819 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
820 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
821 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
822 }
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 assert(fd->type->ty == Tfunction);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
825 fdtype = (TypeFunction *)fd->type;
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 nfparams = Argument::dim(fdtype->parameters); // number of function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
828 nfargs = fargs->dim; // number of function arguments
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 /* Check for match of function arguments with variadic template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
831 * parameter, such as:
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 * template Foo(T, A...) { void Foo(T t, A a); }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
834 * void main() { Foo(1,2,3); }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
835 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
836 tp = isVariadic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
837 if (tp) // if variadic
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
838 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
839 if (nfparams == 0) // if no function parameters
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 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
842 //printf("t = %p\n", t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
843 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
844 declareParameter(paramscope, tp, t);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
845 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
846 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
847 else if (nfargs < nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
848 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
849 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
850 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
851 /* Figure out which of the function parameters matches
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
852 * the tuple template parameter. Do this by matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
853 * type identifiers.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
854 * Set the index of this function parameter to fptupindex.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
855 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
856 for (fptupindex = 0; fptupindex < nfparams; fptupindex++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
857 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
858 Argument *fparam = (Argument *)fdtype->parameters->data[fptupindex];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
859 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
860 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
861 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
862 if (!tp->ident->equals(tid->ident) || tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
863 continue;
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 if (fdtype->varargs) // variadic function doesn't
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
866 goto Lnomatch; // go with variadic template
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 /* The types of the function arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
869 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
870 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
871 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
872 dedargs->data[parameters->dim - 1] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
873
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
874 tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
875 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
876 for (i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
877 { Expression *farg = (Expression *)fargs->data[fptupindex + i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
878 t->objects.data[i] = (void *)farg->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
879 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
880 declareParameter(paramscope, tp, t);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
881 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
882 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
883 fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
884 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
887 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
888 if (nfparams == nfargs)
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 else if (nfargs > nfparams)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
891 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
892 if (fdtype->varargs == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
893 goto Lnomatch; // too many args, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
894 match = MATCHconvert; // match ... with a conversion
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
895 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
896
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
897 L2:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
898 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
899 // Match 'ethis' to any TemplateThisParameter's
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
900 if (ethis)
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 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
903 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
904 TemplateThisParameter *ttp = tp->isTemplateThisParameter();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
905 if (ttp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
906 { MATCH m;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
907
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
908 Type *t = new TypeIdentifier(0, ttp->ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
909 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
910 if (!m)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
911 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
912 if (m < match)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
913 match = m; // pick worst match
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
914 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
915 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
916 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
917 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
918
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
919 // Loop through the function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
920 for (i = 0; i < nfparams; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
921 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
922 /* Skip over function parameters which wound up
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
923 * as part of a template tuple parameter.
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 if (i == fptupindex)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
926 { if (fptupindex == nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
927 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
928 i += tuple_dim - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
929 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
930 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
931
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
932 Argument *fparam = Argument::getNth(fdtype->parameters, i);
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 if (i >= nfargs) // if not enough arguments
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 if (fparam->defaultArg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
937 { /* Default arguments do not participate in template argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
938 * deduction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
939 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
940 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
941 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
942 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
943 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
944 { Expression *farg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
945 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
946 printf("\tfarg->type = %s\n", farg->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
947 printf("\tfparam->type = %s\n", fparam->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
948 #endif
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 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
951 m = farg->type->deduceType(scope, fparam->type, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
952 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
953
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
954 /* If no match, see if there's a conversion to a delegate
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
955 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
956 if (!m && fparam->type->toBasetype()->ty == Tdelegate)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
957 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
958 TypeDelegate *td = (TypeDelegate *)fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
959 TypeFunction *tf = (TypeFunction *)td->next;
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 if (!tf->varargs && Argument::dim(tf->parameters) == 0)
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 m = farg->type->deduceType(scope, tf->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
964 if (!m && tf->next->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
965 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
966 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
967 //printf("\tm2 = %d\n", m);
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 if (m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
971 { if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
972 match = m; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
973 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
974 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
975 }
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 /* The following code for variadic arguments closely
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
978 * matches TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
979 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
980 if (!(fdtype->varargs == 2 && i + 1 == nfparams))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
981 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
982
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
983 /* Check for match with function parameter T...
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
984 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
985 Type *tb = fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
986 switch (tb->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
987 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
988 // Perhaps we can do better with this, see TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
989 case Tsarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
990 { TypeSArray *tsa = (TypeSArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
991 integer_t sz = tsa->dim->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
992 if (sz != nfargs - i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
993 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
994 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
995 case Tarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
996 { TypeArray *ta = (TypeArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
997 for (; i < nfargs; i++)
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 Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1000 assert(arg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1001 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1002 /* If lazy array of delegates,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1003 * convert arg(s) to delegate(s)
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 Type *tret = fparam->isLazyArray();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1006 if (tret)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1007 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1008 if (ta->next->equals(arg->type))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1009 { m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1010 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1011 else
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 m = arg->implicitConvTo(tret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1014 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1015 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1016 if (tret->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1017 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1018 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1021 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1022 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1023 m = arg->type->deduceType(scope, ta->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1024 //m = arg->implicitConvTo(ta->next);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1025 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1026 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1027 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1028 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1029 match = m;
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 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1032 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1033 case Tclass:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1034 case Tident:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1035 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1036
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1037 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1038 goto Lnomatch;
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 }
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 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1043
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1044 /* Fill in any missing arguments with their defaults.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1045 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1046 for (i = nargsi; i < dedargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1047 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1048 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1049 //printf("tp[%d] = %s\n", i, tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1050 /* For T:T*, the dedargs is the T*, dedtypes is the T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1051 * But for function templates, we really need them to match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1052 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1053 Object *oarg = (Object *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1054 Object *oded = (Object *)dedtypes.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1055 //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1056 if (!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 if (oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1059 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1060 if (tp->specialization())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1061 { /* The specialization can work as long as afterwards
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1062 * the oded == oarg
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1063 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1064 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1065 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
1066 MATCH m2 = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam, 0);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1067 //printf("m2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1068 if (!m2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1069 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1070 if (m2 < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1071 match = m2; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1072 if (dedtypes.data[i] != oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1073 error("specialization not allowed for deduced parameter %s", tp->ident->toChars());
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1076 else
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1077 { oded = tp->defaultArg(loc, paramscope);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1078 if (!oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1079 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1080 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1081 declareParameter(paramscope, tp, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1082 dedargs->data[i] = (void *)oded;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1083 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1084 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1085
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1086 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1087 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1088 { /* Check to see if constraint is satisfied.
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 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1091 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1092 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1093 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1094 if (e->isBool(TRUE))
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 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1097 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1098 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1099 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1100 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
1101 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1102 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1103 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1104
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1105 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1106 for (i = 0; i < dedargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1107 { Type *t = (Type *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1108 printf("\tdedargs[%d] = %d, %s\n", i, t->dyncast(), t->toChars());
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1111
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1112 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1113 //printf("\tmatch %d\n", match);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1114 return match;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1117 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1118 //printf("\tnomatch\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1119 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1120 }
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 /**************************************************
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1123 * 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
1124 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1125
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1126 void TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1127 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1128 //printf("TemplateDeclaration::declareParameter('%s', o = %p)\n", tp->ident->toChars(), o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1129
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1130 Type *targ = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1131 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1132 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1133 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1134
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1135 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1136
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1137 if (targ)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1138 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1139 //printf("type %s\n", targ->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1140 s = new AliasDeclaration(0, tp->ident, targ);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1141 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1142 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1143 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1144 //printf("Alias %s %s;\n", sa->ident->toChars(), tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1145 s = new AliasDeclaration(0, tp->ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1146 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1147 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1148 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1149 // tdtypes.data[i] always matches ea here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1150 Initializer *init = new ExpInitializer(loc, ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1151 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1152 assert(tvp);
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 VarDeclaration *v = new VarDeclaration(loc, tvp->valType, tp->ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1155 v->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1156 s = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1157 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1158 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1159 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1160 //printf("\ttuple\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1161 s = new TupleDeclaration(loc, tp->ident, &va->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1162 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1163 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1164 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1165 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1166 o->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1167 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1168 assert(0);
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 if (!sc->insert(s))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1171 error("declaration %s is already defined", tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1172 s->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1173 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1174
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1175 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1176 * Determine if TemplateDeclaration is variadic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1177 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1178
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1179 TemplateTupleParameter *isVariadic(TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1180 { size_t dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1181 TemplateTupleParameter *tp = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1182
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1183 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1184 tp = ((TemplateParameter *)parameters->data[dim - 1])->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1185 return tp;
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 TemplateTupleParameter *TemplateDeclaration::isVariadic()
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 return ::isVariadic(parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1191 }
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 /***********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1194 * We can overload templates.
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 int TemplateDeclaration::isOverloadable()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1198 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1199 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1200 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1201
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1202 /*************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1203 * Given function arguments, figure out which template function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1204 * to expand, and return that function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1205 * If no match, give error message and return NULL.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1206 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1207 * sc instantiation scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1208 * loc instantiation location
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1209 * targsi initial list of template arguments
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1210 * ethis if !NULL, the 'this' pointer argument
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1211 * fargs arguments to function
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1212 * 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
1213 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1214
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1215 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
1216 Objects *targsi, Expression *ethis, Expressions *fargs, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1217 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1218 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1219 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1220 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1221 Objects *tdargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1222 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1223 FuncDeclaration *fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1224
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1225 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1226 printf("TemplateDeclaration::deduceFunctionTemplate() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1227 printf(" targsi:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1228 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1229 { for (int i = 0; i < targsi->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1230 { Object *arg = (Object *)targsi->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1231 printf("\t%s\n", arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1232 }
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 printf(" fargs:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1235 for (int i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1236 { Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1237 printf("\t%s %s\n", arg->type->toChars(), arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1238 //printf("\tty = %d\n", arg->type->ty);
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1241
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1242 for (TemplateDeclaration *td = this; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1243 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1244 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1245 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1246 error("forward reference to template %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1247 goto Lerror;
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 if (!td->onemember || !td->onemember->toAlias()->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1250 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1251 error("is not a function template");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1252 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1253 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1254
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1255 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1256 Objects dedargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1257
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1258 m = td->deduceFunctionTemplateMatch(loc, targsi, ethis, fargs, &dedargs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1259 //printf("deduceFunctionTemplateMatch = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1260 if (!m) // if no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1261 continue;
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 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1264 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1265 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1266 goto Ltd;
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 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1269 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1270 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1271 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1272 //printf("c1 = %d, c2 = %d\n", c1, c2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1273
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1274 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1275 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1276 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1277 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1278 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1279 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1280 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1282 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1283 td_ambig = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1284 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1285
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1286 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1287 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1288 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1289
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1290 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1291 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1292 assert((size_t)td->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1293 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1294 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1295 tdargs->setDim(dedargs.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1296 memcpy(tdargs->data, dedargs.data, tdargs->dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1297 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1298 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1299 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1300 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1301 error(loc, "does not match any template declaration");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1302 goto Lerror;
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 if (td_ambig)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1305 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1306 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
1307 td_best->toChars(), td_ambig->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1308 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1309
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1310 /* The best match is td_best with arguments tdargs.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1311 * Now instantiate the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1312 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1313 assert((size_t)td_best->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1314 ti = new TemplateInstance(loc, td_best, tdargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1315 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1316 fd = ti->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1317 if (!fd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1318 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1319 return fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1320
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1321 Lerror:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1322 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1323 HdrGenState hgs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1324
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1325 OutBuffer bufa;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1326 Objects *args = targsi;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1327 if (args)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1328 { 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
1329 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1330 if (i)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1331 bufa.writeByte(',');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1332 Object *oarg = (Object *)args->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1333 ObjectToCBuffer(&bufa, &hgs, oarg);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1334 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1335 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1336
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1337 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1338 argExpTypesToCBuffer(&buf, fargs, &hgs);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1339 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
1340 bufa.toChars(), buf.toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1341 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1342 return NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1343 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1344
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1345 void TemplateDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1346 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1347 #if 0 // Should handle template functions
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1348 if (onemember && onemember->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1349 buf->writestring("foo ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1350 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1351 buf->writestring(kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1352 buf->writeByte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1353 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1354 buf->writeByte('(');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1355 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1356 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1357 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1358 if (hgs->ddoc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1359 tp = (TemplateParameter *)origParameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1360 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1361 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1362 tp->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1363 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1364 buf->writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1365 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1366 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1367 { buf->writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1368 constraint->toCBuffer(buf, hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1369 buf->writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1370 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1371 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1372
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1373 if (hgs->hdrgen)
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 hgs->tpltMember++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1376 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1377 buf->writebyte('{');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1378 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1379 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1380 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1381 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1382 s->toCBuffer(buf, hgs);
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 buf->writebyte('}');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1385 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1386 hgs->tpltMember--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1387 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1390
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1391 char *TemplateDeclaration::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1392 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1393 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1394
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1395 memset(&hgs, 0, sizeof(hgs));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1396 buf.writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1397 buf.writeByte('(');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1398 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1399 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1400 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1401 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1402 buf.writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1403 tp->toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1404 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1405 buf.writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1406 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1407 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1408 { buf.writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1409 constraint->toCBuffer(&buf, &hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1410 buf.writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1411 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1412 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1413 buf.writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1414 return (char *)buf.extractData();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1415 }
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 /* ======================== Type ============================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1418
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 * Given an identifier, figure out which TemplateParameter it is.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1421 * Return -1 if not found.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1424 int templateIdentifierLookup(Identifier *id, TemplateParameters *parameters)
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 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1427 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
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 if (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1430 return i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1431 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1432 return -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1434
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1435 int templateParameterLookup(Type *tparam, TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1436 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1437 assert(tparam->ty == Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1438 TypeIdentifier *tident = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1439 //printf("\ttident = '%s'\n", tident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1440 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1441 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1442 return templateIdentifierLookup(tident->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1443 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1444 return -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1445 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1446
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1447 /* These form the heart of template argument deduction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1448 * Given 'this' being the type argument to the template instance,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1449 * it is matched against the template declaration parameter specialization
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1450 * 'tparam' to determine the type to be used for the parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1451 * Example:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1452 * template Foo(T:T*) // template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1453 * Foo!(int*) // template instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1454 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1455 * this = int*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1456 * tparam = T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1457 * parameters = [ T:T* ] // Array of TemplateParameter's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1458 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1459 * dedtypes = [ int ] // Array of Expression/Type's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1460 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1461
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1462 MATCH Type::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1463 Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1464 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1465 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1466 printf("Type::deduceType()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1467 printf("\tthis = %d, ", ty); print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1468 printf("\ttparam = %d, ", tparam->ty); tparam->print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1469 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1470 if (!tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1471 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1472
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1473 if (this == tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1474 goto Lexact;
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 (tparam->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1477 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1478 // Determine which parameter tparam is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1479 int i = templateParameterLookup(tparam, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1480 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1481 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1482 if (!sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1483 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1485 /* Need a loc to go with the semantic routine.
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 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1488 if (parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1489 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1490 TemplateParameter *tp = (TemplateParameter *)parameters->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1491 loc = tp->loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1492 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1493
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1494 /* BUG: what if tparam is a template instance, that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1495 * has as an argument another Tident?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1496 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1497 tparam = tparam->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1498 assert(tparam->ty != Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1499 return deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1500 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1501
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1502 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
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 // Found the corresponding parameter tp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1505 if (!tp->isTemplateTypeParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1506 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1507 Type *at = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1508 if (!at)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1509 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1510 dedtypes->data[i] = (void *)this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1511 goto Lexact;
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 if (equals(at))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1514 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1515 else if (ty == Tclass && at->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1516 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1517 return (MATCH) implicitConvTo(at);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1518 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1519 else if (ty == Tsarray && at->ty == Tarray &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1520 nextOf()->equals(at->nextOf()))
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 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1523 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1524 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1525 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1526 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1527
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1528 if (ty != tparam->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1529 return implicitConvTo(tparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1530 // goto Lnomatch;
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 if (nextOf())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1533 return nextOf()->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
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 Lexact:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1536 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1537
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1538 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1539 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1540 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1541
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1542 MATCH TypeSArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1543 Objects *dedtypes)
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 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1546 printf("TypeSArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1547 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1548 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1549 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1550
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1551 // Extra check that array dimensions must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1552 if (tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1553 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1554 if (tparam->ty == Tsarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1555 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1556 TypeSArray *tp = (TypeSArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1557
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1558 if (tp->dim->op == TOKvar &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1559 ((VarExp *)tp->dim)->var->storage_class & STCtemplateparameter)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1560 { int i = templateIdentifierLookup(((VarExp *)tp->dim)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1561 // This code matches code in TypeInstance::deduceType()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1562 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1563 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1564 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1565 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1566 if (!tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1567 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1568 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1569 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1570 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1571 if (!dim->equals(e))
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1574 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1575 { Type *vt = tvp->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1576 MATCH m = (MATCH)dim->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1577 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1578 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1579 dedtypes->data[i] = dim;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1582 else if (dim->toInteger() != tp->dim->toInteger())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1583 return MATCHnomatch;
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 else if (tparam->ty == Taarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1586 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1587 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1588 if (tp->index->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1589 { TypeIdentifier *tident = (TypeIdentifier *)tp->index;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1591 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1592 { Identifier *id = tident->ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1593
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1594 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1595 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1596 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
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 (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1599 { // Found the corresponding template parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1600 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1601 if (!tvp || !tvp->valType->isintegral())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1602 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1603
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1604 if (dedtypes->data[i])
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 if (!dim->equals((Object *)dedtypes->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1607 goto Lnomatch;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1610 { dedtypes->data[i] = (void *)dim;
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 return next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1613 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1616 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1617 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1618 else if (tparam->ty == Tarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1619 { MATCH m;
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 m = next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1622 if (m == MATCHexact)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1623 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1624 return m;
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 return Type::deduceType(sc, tparam, parameters, 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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1630 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1631 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1632
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1633 MATCH TypeAArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
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 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1636 printf("TypeAArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1637 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1638 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1639 #endif
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 // Extra check that index type must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1642 if (tparam && tparam->ty == Taarray)
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 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1645 if (!index->deduceType(sc, tp->index, parameters, dedtypes))
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 return MATCHnomatch;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1650 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1651 }
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 MATCH TypeFunction::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1654 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1655 //printf("TypeFunction::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1656 //printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1657 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1658
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1659 // Extra check that function characteristics must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1660 if (tparam && tparam->ty == Tfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1661 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1662 TypeFunction *tp = (TypeFunction *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1663 if (varargs != tp->varargs ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1664 linkage != tp->linkage)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1665 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1666
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1667 size_t nfargs = Argument::dim(this->parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1668 size_t nfparams = Argument::dim(tp->parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1669
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1670 /* See if tuple match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1671 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1672 if (nfparams > 0 && nfargs >= nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1673 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1674 /* See if 'A' of the template parameter matches 'A'
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1675 * of the type of the last function parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1676 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1677 Argument *fparam = (Argument *)tp->parameters->data[nfparams - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1678 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1679 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1680 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1681 if (tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1682 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1683
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1684 /* Look through parameters to find tuple matching tid->ident
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1685 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1686 size_t tupi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1687 for (; 1; tupi++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1688 { if (tupi == parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1689 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1690 TemplateParameter *t = (TemplateParameter *)parameters->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1691 TemplateTupleParameter *tup = t->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1692 if (tup && tup->ident->equals(tid->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1693 break;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1696 /* The types of the function arguments [nfparams - 1 .. nfargs]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1697 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1698 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1699 int tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1700
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1701 /* See if existing tuple, and whether it matches or not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1702 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1703 Object *o = (Object *)dedtypes->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1704 if (o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1705 { // Existing deduced argument must be a tuple, and must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1706 Tuple *t = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1707 if (!t || t->objects.dim != tuple_dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1708 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1709 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1710 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1711 if (!arg->type->equals((Object *)t->objects.data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1712 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1713 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1714 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1715 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1716 { // Create new tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1717 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1718 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1719 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1720 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1721 t->objects.data[i] = (void *)arg->type;
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 dedtypes->data[tupi] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1724 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1725 nfparams--; // don't consider the last parameter for type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1726 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1727 }
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 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1730 if (nfargs != nfparams)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1731 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1732 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1733 for (size_t i = 0; i < nfparams; i++)
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 Argument *a = Argument::getNth(this->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1736 Argument *ap = Argument::getNth(tp->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1737 if (a->storageClass != ap->storageClass ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1738 !a->type->deduceType(sc, ap->type, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1739 return MATCHnomatch;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1742 return Type::deduceType(sc, tparam, parameters, dedtypes);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1745 MATCH TypeIdentifier::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1746 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1747 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1748 if (tparam && tparam->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1749 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1750 TypeIdentifier *tp = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1751
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1752 for (int i = 0; i < idents.dim; i++)
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 Identifier *id1 = (Identifier *)idents.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1755 Identifier *id2 = (Identifier *)tp->idents.data[i];
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 if (!id1->equals(id2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1758 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1759 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1760 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1761 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1762 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1763
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1764 MATCH TypeInstance::deduceType(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1765 Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1766 Objects *dedtypes)
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 //printf("TypeInstance::deduceType(tparam = %s) %s\n", tparam->toChars(), toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1769 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1770
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1771 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1772 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1773 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1774 TypeInstance *tp = (TypeInstance *)tparam;
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 //printf("tempinst->tempdecl = %p\n", tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1777 //printf("tp->tempinst->tempdecl = %p\n", tp->tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1778 if (!tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1779 { //printf("tp->tempinst->name = '%s'\n", tp->tempinst->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1780 if (!tp->tempinst->name->equals(tempinst->name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1781 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1782 /* Handle case of:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1783 * template Foo(T : sa!(T), alias sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1784 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1785 int i = templateIdentifierLookup(tp->tempinst->name, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1786 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1787 { /* Didn't find it as a parameter identifier. Try looking
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1788 * it up and seeing if is an alias. See Bugzilla 1454
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1789 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1790 Dsymbol *s = tempinst->tempdecl->scope->search(0, tp->tempinst->name, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1791 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1792 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1793 s = s->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1794 TemplateDeclaration *td = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1795 if (td && td == tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1796 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1797 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1800 TemplateParameter *tpx = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1801 // This logic duplicates tpx->matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1802 TemplateAliasParameter *ta = tpx->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1803 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1804 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1805 Dsymbol *sa = tempinst->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1806 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1807 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1808 if (ta->specAlias && sa != ta->specAlias)
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 if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1811 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1812 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
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 if (s != sa)
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 dedtypes->data[i] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1818 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1819 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1820 else if (tempinst->tempdecl != tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1821 goto Lnomatch;
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 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1824 if (tempinst->tiargs->dim != tp->tempinst->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1825 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1826
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1827 for (int i = 0; i < tempinst->tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1828 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1829 //printf("\ttest: tempinst->tiargs[%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1830 int j;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1831 Object *o1 = (Object *)tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1832 Object *o2 = (Object *)tp->tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1833
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1834 Type *t1 = isType(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1835 Type *t2 = isType(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1836
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1837 Expression *e1 = isExpression(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1838 Expression *e2 = isExpression(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1839
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1840 Dsymbol *s1 = isDsymbol(o1);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1841 Dsymbol *s2 = isDsymbol(o2);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1842
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1843 Tuple *v1 = isTuple(o1);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1844 Tuple *v2 = isTuple(o2);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1845 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1846 if (t1) printf("t1 = %s\n", t1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1847 if (t2) printf("t2 = %s\n", t2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1848 if (e1) printf("e1 = %s\n", e1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1849 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
1850 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
1851 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
1852 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
1853 if (v2) printf("v2 = %s\n", v2->toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1854 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1855
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1856 if (t1 && t2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1857 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1858 if (!t1->deduceType(sc, t2, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1859 goto Lnomatch;
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 else if (e1 && 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 if (!e1->equals(e2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1864 { if (e2->op == TOKvar)
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 /*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1867 * (T:Number!(e2), int e2)
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 j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1870 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1871 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1872 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1873 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1874 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1875 else if (e1 && t2 && t2->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1876 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1877 j = templateParameterLookup(t2, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1878 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1879 if (j == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1880 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1881 TemplateParameter *tp = (TemplateParameter *)parameters->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1882 // BUG: use tp->matchArg() instead of the following
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1883 TemplateValueParameter *tv = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1884 if (!tv)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1885 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1886 Expression *e = (Expression *)dedtypes->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1887 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1888 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1889 if (!e1->equals(e))
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1892 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1893 { Type *vt = tv->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1894 MATCH m = (MATCH)e1->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1895 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1896 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1897 dedtypes->data[j] = e1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1898 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1899 }
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1900 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
1901 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1902 j = templateParameterLookup(t2, parameters);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1903 if (j == -1)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1904 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1905 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
1906 // 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
1907 TemplateAliasParameter *ta = tp->isTemplateAliasParameter();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1908 if (!ta)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1909 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1910 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
1911 if (s)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1912 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1913 if (!s1->equals(s))
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1914 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1915 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1916 else
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1917 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1918 dedtypes->data[j] = s1;
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 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1921 else if (s1 && s2)
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1922 {
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1923 if (!s1->equals(s2))
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1924 goto Lnomatch;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1925 }
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
1926 // BUG: Need to handle tuple parameters
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1927 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1928 goto Lnomatch;
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 return Type::deduceType(sc, tparam, parameters, 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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1934 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1935 }
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 MATCH TypeStruct::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1938 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1939 //printf("TypeStruct::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1940 //printf("\tthis->parent = %s, ", sym->parent->toChars()); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1941 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
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 this struct is a template struct, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1944 * it against a template instance, convert the struct type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1945 * to a template instance, too, and try again.
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 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1948
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1949 if (tparam && tparam->ty == Tinstance)
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 if (ti && ti->toAlias() == sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1952 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1953 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1954 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1955 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1956
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1957 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1958 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1959 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1960 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1961 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1962 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1963 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1964 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1965 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1966 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1967 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1968 /* Slice off the .foo in S!(T).foo
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 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1971 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1972 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1973 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1974 }
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 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1979 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1980 if (tparam && tparam->ty == Tstruct)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1981 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1982 TypeStruct *tp = (TypeStruct *)tparam;
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 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1985 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1986 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1987 return Type::deduceType(sc, tparam, parameters, dedtypes);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1990 MATCH TypeEnum::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1991 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1992 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1993 if (tparam && tparam->ty == Tenum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1994 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1995 TypeEnum *tp = (TypeEnum *)tparam;
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 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1998 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1999 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2000 return Type::deduceType(sc, tparam, parameters, dedtypes);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2003 MATCH TypeTypedef::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2004 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2005 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2006 if (tparam && tparam->ty == Ttypedef)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2007 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2008 TypeTypedef *tp = (TypeTypedef *)tparam;
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 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2011 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2012 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2013 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2014 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2015
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2016 MATCH TypeClass::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
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 //printf("TypeClass::deduceType(this = %s)\n", toChars());
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 this class is a template class, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2021 * it against a template instance, convert the class type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2022 * to a template instance, too, and try again.
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 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2025
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2026 if (tparam && tparam->ty == Tinstance)
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 if (ti && ti->toAlias() == sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2029 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2030 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2031 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2032 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2033
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2034 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2035 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2036 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2037 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2038 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2039 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2040 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2041 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2042 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2043 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2044 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2045 /* Slice off the .foo in S!(T).foo
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 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2048 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2049 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2050 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2051 }
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 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2056 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2057 if (tparam && tparam->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2058 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2059 TypeClass *tp = (TypeClass *)tparam;
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 //printf("\t%d\n", (MATCH) implicitConvTo(tp));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2062 return (MATCH) implicitConvTo(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2063 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2064 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2065 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2066
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2067 /* ======================== TemplateParameter =============================== */
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 TemplateParameter::TemplateParameter(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2070 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2071 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2072 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2073 this->sparam = NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2076 TemplateTypeParameter *TemplateParameter::isTemplateTypeParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2077 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2078 return NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2081 TemplateValueParameter *TemplateParameter::isTemplateValueParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2082 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2083 return NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2086 TemplateAliasParameter *TemplateParameter::isTemplateAliasParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2087 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2088 return NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2091 TemplateTupleParameter *TemplateParameter::isTemplateTupleParameter()
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2096 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2097 TemplateThisParameter *TemplateParameter::isTemplateThisParameter()
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 return NULL;
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2102
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2103 /* ======================== TemplateTypeParameter =========================== */
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 // type-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2106
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2107 TemplateTypeParameter::TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2108 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2109 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2110 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2111 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2112 this->specType = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2113 this->defaultType = defaultType;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2116 TemplateTypeParameter *TemplateTypeParameter::isTemplateTypeParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2117 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2118 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2119 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2120
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2121 TemplateParameter *TemplateTypeParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2122 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2123 TemplateTypeParameter *tp = new TemplateTypeParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2124 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2125 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2126 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2127 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2128 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2129 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2130
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2131 void TemplateTypeParameter::declareParameter(Scope *sc)
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 //printf("TemplateTypeParameter::declareParameter('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2134 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2135 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2136 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2137 error(loc, "parameter '%s' multiply defined", ident->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2140 void TemplateTypeParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2141 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2142 //printf("TemplateTypeParameter::semantic('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2143 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2144 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2145 specType = specType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2146 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2147 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2148 if (defaultType)
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 defaultType = defaultType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2151 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2152 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2153 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2154
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 * Determine if two TemplateParameters are the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2157 * as far as TemplateDeclaration overloading goes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2158 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2159 * 1 match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2160 * 0 no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2161 */
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 int TemplateTypeParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2164 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2165 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2166
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2167 if (ttp)
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 if (specType != ttp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2170 goto Lnomatch;
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 if (specType && !specType->equals(ttp->specType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2173 goto Lnomatch;
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 return 1; // match
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2178 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2179 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2180 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2181
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2182 /*******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2183 * Match to a particular TemplateParameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2184 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2185 * i i'th argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2186 * tiargs[] actual arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2187 * parameters[] template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2188 * dedtypes[] deduced arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2189 * *psparam set to symbol declared and initialized to dedtypes[i]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2190 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2191
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2192 MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2193 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
2194 Declaration **psparam, int flags)
336
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 //printf("TemplateTypeParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2197 Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2198 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2199 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2200 Type *ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2201
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2202 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2203 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2204 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2205 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2206 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2207 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2208 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2209 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2210 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2211 if (!oarg)
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 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2216 ta = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2217 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2218 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2219 //printf("ta is %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2220
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2221 t = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2222
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2223 if (specType)
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 //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
2226 MATCH m2 = ta->deduceType(sc, specType, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2227 if (m2 == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2228 { //printf("\tfailed deduceType\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2229 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2230 }
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 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2233 m = m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2234 t = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2235 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2236 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2237 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2238 // So that matches with specializations are better
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2239 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2240 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2241 { // Must match already deduced type
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 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2244 if (!t->equals(ta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2245 { //printf("t = %s ta = %s\n", t->toChars(), ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2246 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2247 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2248 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2251 if (!t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2252 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2253 dedtypes->data[i] = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2254 t = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2255 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2256 *psparam = new AliasDeclaration(loc, ident, t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2257 //printf("\tm = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2258 return m;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2261 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2262 //printf("\tm = %d\n", MATCHnomatch);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2263 return MATCHnomatch;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2267 void TemplateTypeParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2268 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2269 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2270
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2271 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2272 Type *ta = isType(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2273
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2274 assert(ta);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2275
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2276 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2277 printf("\tSpecialization: %s\n", specType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2278 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2279 printf("\tDefault: %s\n", defaultType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2280 printf("\tArgument: %s\n", t ? t->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2281 printf("\tDeduced Type: %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2282 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2285 void TemplateTypeParameter::toCBuffer(OutBuffer *buf, HdrGenState *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 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2288 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2289 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2290 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2291 specType->toCBuffer(buf, NULL, hgs);
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 if (defaultType)
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 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2296 defaultType->toCBuffer(buf, NULL, hgs);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2299
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2300
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2301 void *TemplateTypeParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2302 { Type *t;
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 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2305 t = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2306 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2307 { // Use this for alias-parameter's too (?)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2308 t = new TypeIdentifier(loc, ident);
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 (void *)t;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2314 Object *TemplateTypeParameter::specialization()
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 return specType;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2319
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2320 Object *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2321 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2322 Type *t;
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 t = defaultType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2325 if (t)
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 t = t->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2328 t = t->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2329 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2330 return t;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2333 /* ======================== TemplateThisParameter =========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2334
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2335 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2336 // this-parameter
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 TemplateThisParameter::TemplateThisParameter(Loc loc, Identifier *ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2339 Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2340 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2341 : TemplateTypeParameter(loc, ident, specType, defaultType)
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2345 TemplateThisParameter *TemplateThisParameter::isTemplateThisParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2346 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2347 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2348 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2349
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2350 TemplateParameter *TemplateThisParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2351 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2352 TemplateThisParameter *tp = new TemplateThisParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2353 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2354 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2355 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2356 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2357 return tp;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2360 void TemplateThisParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2361 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2362 buf->writestring("this ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2363 TemplateTypeParameter::toCBuffer(buf, hgs);
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 #endif
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 ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2368
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2369 // alias-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2370
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2371 Dsymbol *TemplateAliasParameter::sdummy = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2372
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2373 TemplateAliasParameter::TemplateAliasParameter(Loc loc, Identifier *ident, Type *specAliasT, Type *defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2374 : TemplateParameter(loc, ident)
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 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2377 this->specAliasT = specAliasT;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2378 this->defaultAlias = defaultAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2379
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2380 this->specAlias = NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2383 TemplateAliasParameter *TemplateAliasParameter::isTemplateAliasParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2384 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2385 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2386 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2387
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2388 TemplateParameter *TemplateAliasParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2389 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2390 TemplateAliasParameter *tp = new TemplateAliasParameter(loc, ident, specAliasT, defaultAlias);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2391 if (tp->specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2392 tp->specAliasT = specAliasT->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2393 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2394 tp->defaultAlias = defaultAlias->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2395 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2396 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2397
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2398 void TemplateAliasParameter::declareParameter(Scope *sc)
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 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2401 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2402 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2403 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2404 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2405
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2406 void TemplateAliasParameter::semantic(Scope *sc)
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 (specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2409 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2410 specAlias = specAliasT->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2411 if (!specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2412 error(loc, "%s is not a symbol", specAliasT->toChars());
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 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2415 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2416 defaultAlias = defaultAlias->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2417 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2418 }
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 int TemplateAliasParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2421 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2422 TemplateAliasParameter *tap = tp->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2423
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2424 if (tap)
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 if (specAlias != tap->specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2427 goto Lnomatch;
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 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2430 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2431
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2432 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2433 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2434 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2436 MATCH TemplateAliasParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2437 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
2438 Declaration **psparam, int flags)
336
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 Dsymbol *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2441 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2442 Expression *ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2443
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2444 //printf("TemplateAliasParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2445
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2446 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2447 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2448 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2449 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2450 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2451 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2452 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2453 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2454 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2455 if (!oarg)
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 }
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 sa = getDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2461 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2462 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2463
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2464 if (specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2465 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2466 if (!sa || sa == sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2467 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2468 if (sa != specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2469 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2470 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2471 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2472 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2473 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2474
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2475 if (!sa || s != sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2476 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2477 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2478 dedtypes->data[i] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2479
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2480 *psparam = new AliasDeclaration(loc, ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2481 return MATCHexact;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2484 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2485 return MATCHnomatch;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2488
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2489 void TemplateAliasParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2490 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2491 printf(" %s\n", ident->toChars());
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 Dsymbol *sa = isDsymbol(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2494 assert(sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2495
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2496 printf("\tArgument alias: %s\n", sa->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2497 }
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 void TemplateAliasParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2500 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2501 buf->writestring("alias ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2502 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2503 if (specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2504 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2505 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2506 specAliasT->toCBuffer(buf, NULL, hgs);
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 if (defaultAlias)
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 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2511 defaultAlias->toCBuffer(buf, NULL, hgs);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2514
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 void *TemplateAliasParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2517 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2518
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2519 s = specAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2520 if (!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 if (!sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2523 sdummy = new Dsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2524 s = sdummy;
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 (void*)s;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2530 Object *TemplateAliasParameter::specialization()
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 return specAliasT;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2535
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2536 Object *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2537 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2538 Dsymbol *s = NULL;
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 if (defaultAlias)
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 s = defaultAlias->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2543 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2544 error("%s is not a symbol", defaultAlias->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2545 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2546 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2547 }
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 ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2550
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2551 // value-parameter
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 Expression *TemplateValueParameter::edummy = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2554
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2555 TemplateValueParameter::TemplateValueParameter(Loc loc, Identifier *ident, Type *valType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2556 Expression *specValue, Expression *defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2557 : TemplateParameter(loc, ident)
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 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2560 this->valType = valType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2561 this->specValue = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2562 this->defaultValue = defaultValue;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2565 TemplateValueParameter *TemplateValueParameter::isTemplateValueParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2566 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2567 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2568 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2569
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2570 TemplateParameter *TemplateValueParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2571 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2572 TemplateValueParameter *tp =
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2573 new TemplateValueParameter(loc, ident, valType, specValue, defaultValue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2574 tp->valType = valType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2575 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2576 tp->specValue = specValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2577 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2578 tp->defaultValue = defaultValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2579 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2580 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2581
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2582 void TemplateValueParameter::declareParameter(Scope *sc)
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 VarDeclaration *v = new VarDeclaration(loc, valType, ident, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2585 v->storage_class = STCtemplateparameter;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2586 if (!sc->insert(v))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2587 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2588 sparam = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2589 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2591 void TemplateValueParameter::semantic(Scope *sc)
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 sparam->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2594 valType = valType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2595 if (!(valType->isintegral() || valType->isfloating() || valType->isString()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2596 valType->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2597 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
2598
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2599 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2600 { Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2601
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2602 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2603 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2604 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2605 if (e->op == TOKint64 || e->op == TOKfloat64 ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2606 e->op == TOKcomplex80 || e->op == TOKnull || e->op == TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2607 specValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2608 //e->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2609 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2610
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2611 #if 0 // defer semantic analysis to arg match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2612 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2613 { Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2614
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2615 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2616 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2617 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2618 if (e->op == TOKint64)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2619 defaultValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2620 //e->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2621 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2622 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2623 }
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 int TemplateValueParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2626 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2627 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2628
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2629 if (tvp)
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 (valType != tvp->valType)
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 if (valType && !valType->equals(tvp->valType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2635 goto Lnomatch;
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 if (specValue != tvp->specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2638 goto Lnomatch;
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 return 1; // match
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2643 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2644 return 0;
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
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 MATCH TemplateValueParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2649 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
2650 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2651 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2652 //printf("TemplateValueParameter::matchArg()\n");
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 Initializer *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2655 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2656 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2657 Expression *ei;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2658 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2659
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2660 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2661 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2662 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2663 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2664 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2665 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2666 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2667 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2668 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2669 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2670 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2671 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2672 }
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 ei = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2675 Type *vt;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2677 if (!ei && oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2678 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2679
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2680 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2681 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2682 if (!ei || ei == edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2683 goto Lnomatch;
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 Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2686
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2687 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2688 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2689 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2690
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2691 ei = ei->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2692 ei = ei->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2693 ei = ei->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2694 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2695 //printf("e : %s, %s\n", e->toChars(), e->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2696 if (!ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2697 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2698 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2699 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2700 { // Must match already deduced value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2701 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2702
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2703 if (!ei || !ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2704 goto Lnomatch;
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 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2707 //printf("valType: %s, ty = %d\n", valType->toChars(), valType->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2708 vt = valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2709 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2710 if (ei->type)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2711 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2712 m = (MATCH)ei->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2713 //printf("m: %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2714 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2715 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2716 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2717 dedtypes->data[i] = ei;
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 init = new ExpInitializer(loc, ei);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2720 sparam = new VarDeclaration(loc, vt, ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2721 sparam->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2722 *psparam = sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2723 return m;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2726 //printf("\tno match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2727 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2728 return MATCHnomatch;
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
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 void TemplateValueParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2733 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2734 printf(" %s\n", ident->toChars());
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 Expression *ea = isExpression(oded);
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 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2739 printf("\tSpecialization: %s\n", specValue->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2740 printf("\tArgument Value: %s\n", ea ? ea->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2741 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2744 void TemplateValueParameter::toCBuffer(OutBuffer *buf, HdrGenState *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 valType->toCBuffer(buf, ident, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2747 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2748 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2749 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2750 specValue->toCBuffer(buf, hgs);
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 if (defaultValue)
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 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2755 defaultValue->toCBuffer(buf, hgs);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2758
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 void *TemplateValueParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2761 { Expression *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2762
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2763 e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2764 if (!e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2765 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2766 // Create a dummy value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2767 if (!edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2768 edummy = valType->defaultInit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2769 e = edummy;
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 (void *)e;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2775 Object *TemplateValueParameter::specialization()
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 return specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2778 }
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
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2781 Object *TemplateValueParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2782 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2783 Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2784 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2785 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2786 e = e->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2787 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2788 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2789 if (e->op == TOKdefault)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2790 { DefaultInitExp *de = (DefaultInitExp *)e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2791 e = de->resolve(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2792 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2793 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2794 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2795 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2796 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2797
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2798 /* ======================== TemplateTupleParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2799
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2800 // variadic-parameter
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(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2803 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2804 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2805 this->ident = ident;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2808 TemplateTupleParameter *TemplateTupleParameter::isTemplateTupleParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2809 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2810 return this;
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 TemplateParameter *TemplateTupleParameter::syntaxCopy()
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 TemplateTupleParameter *tp = new TemplateTupleParameter(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2816 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2817 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2818
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2819 void TemplateTupleParameter::declareParameter(Scope *sc)
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 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2822 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2823 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2824 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2825 }
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 void TemplateTupleParameter::semantic(Scope *sc)
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 }
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 int TemplateTupleParameter::overloadMatch(TemplateParameter *tp)
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 TemplateTupleParameter *tvp = tp->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2834
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2835 if (tvp)
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 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2838 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2839
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2840 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2841 return 0;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2844 MATCH TemplateTupleParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2845 Objects *tiargs, int i, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2846 Objects *dedtypes,
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
2847 Declaration **psparam, int flags)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2848 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2849 //printf("TemplateTupleParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2850
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2851 /* The rest of the actual arguments (tiargs[]) form the match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2852 * for the variadic parameter.
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 assert(i + 1 == dedtypes->dim); // must be the last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2855 Tuple *ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2856 if (i + 1 == tiargs->dim && isTuple((Object *)tiargs->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2857 ovar = isTuple((Object *)tiargs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2858 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2859 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2860 ovar = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2861 //printf("ovar = %p\n", ovar);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2862 if (i < tiargs->dim)
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 //printf("i = %d, tiargs->dim = %d\n", i, tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2865 ovar->objects.setDim(tiargs->dim - i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2866 for (size_t j = 0; j < ovar->objects.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2867 ovar->objects.data[j] = tiargs->data[i + j];
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 *psparam = new TupleDeclaration(loc, ident, &ovar->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2871 dedtypes->data[i] = (void *)ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2872 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2873 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2874
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 void TemplateTupleParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2877 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2878 printf(" %s... [", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2879 Tuple *v = isTuple(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2880 assert(v);
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 //printf("|%d| ", v->objects.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2883 for (int i = 0; i < v->objects.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2884 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2885 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2886 printf(", ");
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 Object *o = (Object *)v->objects.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2889
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2890 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2891 if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2892 printf("alias: %s", sa->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2893
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2894 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2895 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2896 printf("type: %s", ta->toChars());
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 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2899 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2900 printf("exp: %s", ea->toChars());
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 assert(!isTuple(o)); // no nested Tuple arguments
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2905 printf("]\n");
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 void TemplateTupleParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2909 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2910 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2911 buf->writestring("...");
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 void *TemplateTupleParameter::dummyArg()
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2921 Object *TemplateTupleParameter::specialization()
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
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2927 Object *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2928 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2929 return 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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2932 /* ======================== TemplateInstance ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2933
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2934 TemplateInstance::TemplateInstance(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2935 : ScopeDsymbol(NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2936 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2937 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2938 printf("TemplateInstance(this = %p, ident = '%s')\n", this, ident ? ident->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2939 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2940 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2941 this->name = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2942 this->tiargs = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2943 this->tempdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2944 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2945 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2946 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2947 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2948 this->semantictiargsdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2949 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2950 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2951 this->havetempdecl = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2952 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2953 this->errors = 0;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2954
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
2955 #if IN_LLVM
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2956 // LDC
1067
7ce8355fbcc6 Improved template emission control for singleobj building.
Christian Kamm <kamm incasoftware de>
parents: 948
diff changeset
2957 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
2958 this->tinst = NULL;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2959 this->tmodule = NULL;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
2960 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2961 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2962
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2963 /*****************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2964 * 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
2965 * template to instantiate.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2966 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2967
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2968 TemplateInstance::TemplateInstance(Loc loc, TemplateDeclaration *td, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2969 : ScopeDsymbol(NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2970 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2971 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2972 printf("TemplateInstance(this = %p, tempdecl = '%s')\n", this, td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2973 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2974 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2975 this->name = td->ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2976 this->tiargs = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2977 this->tempdecl = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2978 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2979 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2980 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2981 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2982 this->semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2983 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2984 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2985 this->havetempdecl = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2986 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2987 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
2988
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
2989 #if IN_LLVM
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
2990 // LDC
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2991 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
2992 this->tmodule = NULL;
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
2993 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2994
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2995 assert((size_t)tempdecl->scope > 0x10000);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2998
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2999 Objects *TemplateInstance::arraySyntaxCopy(Objects *objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3000 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3001 Objects *a = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3002 if (objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3003 { a = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3004 a->setDim(objs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3005 for (size_t i = 0; i < objs->dim; i++)
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 Type *ta = isType((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3008 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3009 a->data[i] = ta->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3010 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3011 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3012 Expression *ea = isExpression((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3013 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3014 a->data[i] = ea->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3015 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3016 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3017 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3018 return a;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3021 Dsymbol *TemplateInstance::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3022 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3023 TemplateInstance *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 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3026 ti = (TemplateInstance *)s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3027 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3028 ti = new TemplateInstance(loc, name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3029
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3030 ti->tiargs = arraySyntaxCopy(tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3031
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3032 ScopeDsymbol::syntaxCopy(ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3033 return ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3034 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3037 void TemplateInstance::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3038 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3039 if (global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3040 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3041 if (!global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3042 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3043 /* Trying to soldier on rarely generates useful messages
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3044 * at this point.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3045 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3046 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3047 }
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3051 printf("\n+TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3052 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3053 if (inst) // if semantic() was already run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3054 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3055 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3056 printf("-TemplateInstance::semantic('%s', this=%p) already run\n", inst->toChars(), inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3057 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3058 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3059 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3060
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3061 if (semanticdone != 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3062 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3063 error(loc, "recursive template expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3064 // inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3065 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3066 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3067 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3068
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3069 // 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
3070 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
3071
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3072 // 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
3073 if (tinst)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3074 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
3075 else
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
3076 tmodule = sc->module;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
3077 //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
3078
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3079 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3080 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3081 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3082 if (havetempdecl)
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 assert((size_t)tempdecl->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3085 // Deduce tdtypes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3086 tdtypes.setDim(tempdecl->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3087 if (!tempdecl->matchWithInstance(this, &tdtypes, 0))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3088 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3089 error("incompatible arguments for template instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3090 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3091 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3092 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3093 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3094 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3095 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3096 /* 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
3097 * (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
3098 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3099 semanticTiargs(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3100
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3101 tempdecl = findTemplateDeclaration(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3102 if (tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3103 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3104 if (!tempdecl || global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3105 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3106 //printf("error return %p, %d\n", tempdecl, global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3107 return; // error recovery
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3110
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3111 hasNestedArgs(tiargs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3112
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3113 /* See if there is an existing TemplateInstantiation that already
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3114 * implements the typeargs. If so, just refer to that one instead.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3115 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3116
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3117 for (size_t i = 0; i < tempdecl->instances.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3118 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3119 TemplateInstance *ti = (TemplateInstance *)tempdecl->instances.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3120 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3121 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
3122 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3123 assert(tdtypes.dim == ti->tdtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3124
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3125 // Nesting must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3126 if (isnested != ti->isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3127 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3128 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3129 if (isnested && sc->parent != ti->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3130 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3131 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3132 for (size_t j = 0; j < tdtypes.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3133 { Object *o1 = (Object *)tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3134 Object *o2 = (Object *)ti->tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3135 if (!match(o1, o2, tempdecl, sc))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3136 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3137 }
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 // It's a match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3140 inst = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3141 parent = ti->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3142 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3143 printf("\tit's a match with instance %p\n", inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3144 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3145 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3146
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3147 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3148 ;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3149 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3150
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3151 /* So, we need to implement 'this' instance.
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3154 printf("\timplement template instance '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3155 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3156 unsigned errorsave = global.errors;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3157 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3158 int tempdecl_instance_idx = tempdecl->instances.dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3159 tempdecl->instances.push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3160 parent = tempdecl->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3161 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3162
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3163 ident = genIdent(); // need an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3164
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3165 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3166 if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3167 parent = isnested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3168 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3169 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3170
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3171 // Add 'this' to the enclosing scope's members[] so the semantic routines
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3172 // will get called on the instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3173 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3174 int dosemantic3 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3175 { Array *a;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3176
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3177 Scope *scx = sc;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3178 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3179 for (scx = sc; scx; scx = scx->enclosing)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3180 if (scx->scopesym)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3181 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3182 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3183
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3184 //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
3185 if (scx && scx->scopesym &&
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3186 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
3187 #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
3188 /* 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
3189 * 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
3190 * 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
3191 *
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3192 * see bugzilla 2500.
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3193 */
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3194 && !scx->module->selfImports()
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3195 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3196 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3197 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3198 //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
3199 a = scx->scopesym->members;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3200 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3201 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3202 { Module *m = sc->module->importedFrom;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3203 //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
3204 a = m->members;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3205 if (m->semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3206 dosemantic3 = 1;
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 for (int i = 0; 1; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3209 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3210 if (i == a->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3211 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3212 a->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3213 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3214 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3215 if (this == (Dsymbol *)a->data[i]) // if already in Array
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3216 break;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3219 #endif
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 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3222 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3223
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3224 // Create our own scope for the template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3225 Scope *scope = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3226 if (!scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3227 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3228 error("forward reference to template declaration %s\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3229 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3230 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3231
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3232 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3233 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3234 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3235 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3236 argsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3237 scope = scope->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3239 // 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
3240 Scope *paramscope = scope->push();
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3241 paramscope->stc = 0;
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3242 declareParameters(paramscope);
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3243 paramscope->pop();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3244
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3245 // Add members of template instance to template instance symbol table
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3246 // parent = scope->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3247 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3248 int memnum = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3249 for (int i = 0; i < members->dim; i++)
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 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3252 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3253 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
3254 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3255 memnum |= s->addMember(scope, this, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3256 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3257 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3258 printf("adding members done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3259 #endif
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 /* See if there is only one member of template instance, and that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3262 * member has the same name as the template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3263 * If so, this template instance becomes an alias for that member.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3264 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3265 //printf("members->dim = %d\n", members->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3266 if (members->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3267 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3268 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3269 if (Dsymbol::oneMembers(members, &s) && s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3270 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3271 //printf("s->kind = '%s'\n", s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3272 //s->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3273 //printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3274 if (s->ident && s->ident->equals(tempdecl->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3275 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3276 //printf("setting aliasdecl\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3277 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
3278
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3279 #if IN_LLVM
1089
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3280 // 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
3281 if (tempdecl->llvmInternal) {
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3282 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
3283 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
3284 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
3285 }
d33b0d4b816a Make sure instantiations of template intrinsics are marked as intrinsics.
Frits van Bommel <fvbommel wxs.nl>
parents: 1067
diff changeset
3286 }
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3287 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3288 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3291
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3292 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3293 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3294 printf("\tdo semantic() on template instance members '%s'\n", toChars());
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 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3297 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3298 //printf("isnested = %d, sc->parent = %s\n", isnested, sc->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3299 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
3300 sc2->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3301
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3302 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3303 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3304 __try
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3305 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3306 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3307 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3308 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3309 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3310 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3311 //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
3312 //printf("test: isnested = %d, sc2->parent = %s\n", isnested, sc2->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3313 // if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3314 // s->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3315 //printf("test3: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3316 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3317 //printf("test4: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3318 sc2->module->runDeferredSemantic();
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 !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3321 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3322 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3323 __except (__ehfilter(GetExceptionInformation()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3324 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3325 global.gag = 0; // ensure error message gets printed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3326 error("recursive expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3327 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3328 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3329 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3330 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3331
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3332 /* If any of the instantiation members didn't get semantic() run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3333 * on them due to forward references, we cannot run semantic2()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3334 * or semantic3() yet.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3335 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3336 for (size_t i = 0; i < Module::deferred.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3337 { Dsymbol *sd = (Dsymbol *)Module::deferred.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3338
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3339 if (sd->parent == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3340 goto Laftersemantic;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3341 }
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 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3344 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3345 * for initializers inside a function.
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 // if (sc->parent->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3348
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3349 /* BUG 782: this has problems if the classes this depends on
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3350 * are forward referenced. Find a way to defer semantic()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3351 * on this template.
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 semantic2(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3354
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3355 if (sc->func || dosemantic3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3356 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3357 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3358 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3359
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3360 Laftersemantic:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3361 sc2->pop();
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 scope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3364
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3365 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3366 if (global.errors != errorsave)
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 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
3369 if(tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3370 tinst->printInstantiationTrace();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3371 errors = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3372 if (global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3373 tempdecl->instances.remove(tempdecl_instance_idx);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3374 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3375
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3376 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3377 printf("-TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3378 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3379 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3382 void TemplateInstance::semanticTiargs(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3383 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3384 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3385 if (semantictiargsdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3386 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3387 semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3388 semanticTiargs(loc, sc, tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3389 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3390
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3391 void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3392 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3393 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3394 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3395 if (!tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3396 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3397 for (size_t j = 0; j < tiargs->dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3398 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3399 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3400 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3401 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3402 Dsymbol *sa = isDsymbol(o);
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 //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
3405 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3406 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3407 //printf("type %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3408 // It might really be an Expression or an Alias
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3409 ta->resolve(loc, sc, &ea, &ta, &sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3410 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3411 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3412 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3413 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3414 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3415 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3416 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3417 { tiargs->data[j] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3418 TupleDeclaration *d = sa->toAlias()->isTupleDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3419 if (d)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3420 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3421 size_t dim = d->objects->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3422 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3423 tiargs->insert(j, d->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3424 j--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3425 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3426 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3427 else if (ta)
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 if (ta->ty == Ttuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3430 { // Expand tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3431 TypeTuple *tt = (TypeTuple *)ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3432 size_t dim = tt->arguments->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3433 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3434 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3435 { tiargs->reserve(dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3436 for (size_t i = 0; i < dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3437 { Argument *arg = (Argument *)tt->arguments->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3438 tiargs->insert(j + i, arg->type);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3441 j--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3442 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3443 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3444 tiargs->data[j] = ta;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3447 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3448 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3449 tiargs->data[j] = Type::terror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3450 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3451 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3452 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3453 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3454 if (!ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3455 { assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3456 ea = new IntegerExp(0);
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(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3459 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3460 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3461 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3462 if (ea->op == TOKtype)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3463 tiargs->data[j] = ea->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3464 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3465 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3466 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3467 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3468 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3469 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3470 assert(0);
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("1: tiargs->data[%d] = %p\n", j, tiargs->data[j]);
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 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3475 printf("-TemplateInstance::semanticTiargs('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3476 for (size_t j = 0; j < tiargs->dim; j++)
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 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3479 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3480 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3481 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3482 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3483
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3484 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
3485 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3486 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3487 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3488
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 * Find template declaration corresponding to template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3491 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3492
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3493 TemplateDeclaration *TemplateInstance::findTemplateDeclaration(Scope *sc)
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 //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3496 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3497 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3498 /* Given:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3499 * foo!( ... )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3500 * figure out which TemplateDeclaration foo refers to.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3501 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3502 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3503 Dsymbol *scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3504 Identifier *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3505 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3506
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3507 id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3508 s = sc->search(loc, id, &scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3509 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3510 { error("identifier '%s' is not defined", id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3511 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3512 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3513 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3514 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
3515 if (s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3516 printf("s->parent = '%s'\n", s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3517 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3518 withsym = scopesym->isWithScopeSymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3519
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3520 /* We might have found an alias within a template when
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3521 * we really want the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3522 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3523 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3524 if (s->parent &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3525 (ti = s->parent->isTemplateInstance()) != NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3526 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3527 if (
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3528 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3529 ti->toAlias()->ident == id)
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 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3532 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3533 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3534 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3535 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3536 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3537 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3538 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3539 tempdecl = tempdecl->overroot; // then get the start
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3540 s = tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3541 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3542 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3543
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3544 s = s->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3545
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3546 /* It should be a TemplateDeclaration, not some other symbol
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 tempdecl = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3549 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3550 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3551 if (!s->parent && global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3552 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3553 if (!s->parent && s->getType())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3554 { Dsymbol *s2 = s->getType()->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3555 if (!s2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3556 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3557 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
3558 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3559 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3560 s = s2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3561 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3562 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3563 //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3564 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3565 //assert(s->parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3566 TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3567 if (ti &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3568 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3569 ti->toAlias()->ident == id)
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 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3572 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3573 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3574 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3575 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3576 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3577 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3578 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3579 tempdecl = tempdecl->overroot; // then get the start
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 else
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 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
3584 return NULL;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3587 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3588 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3589 assert(tempdecl->isTemplateDeclaration());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3590 return tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3591 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3592
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3593 TemplateDeclaration *TemplateInstance::findBestMatch(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3594 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3595 /* Since there can be multiple TemplateDeclaration's with the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3596 * name, look for the best match.
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 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3599 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3600 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3601 Objects dedtypes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3602
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3603 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3604 printf("TemplateInstance::findBestMatch()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3605 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3606 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
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 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3609
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3610 //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
3611
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3612 // If more arguments than parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3613 // then this is no match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3614 if (td->parameters->dim < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3615 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3616 if (!td->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3617 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3618 }
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 dedtypes.setDim(td->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3621 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3622 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3623 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3624 error("forward reference to template declaration %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3625 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3626 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3627 m = td->matchWithInstance(this, &dedtypes, 0);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3628 //printf("matchWithInstance = %d\n", m);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3629 if (!m) // no match at all
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3630 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3631
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3632 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3633 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3634 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3635 goto Ltd;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3636
336
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 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3639 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3640 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3641 //printf("c1 = %d, c2 = %d\n", c1, c2);
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 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3644 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3645 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3646 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3647 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3648 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3649 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3650
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3651 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3652 td_ambig = td;
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 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3656 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3657 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3658
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3659 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3660 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3661 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3662 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3663 tdtypes.setDim(dedtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3664 memcpy(tdtypes.data, dedtypes.data, tdtypes.dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3665 continue;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3668 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3669 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3670 error("%s does not match any template declaration", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3671 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3672 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3673 if (td_ambig)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3674 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3675 error("%s matches more than one template declaration, %s and %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3676 toChars(), td_best->toChars(), td_ambig->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3677 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3678
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3679 /* The best match is td_best
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3680 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3681 tempdecl = td_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3682
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3683 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3684 /* Cast any value arguments to be same type as value parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3685 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3686 for (size_t i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3687 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3688 Expression *ea = isExpression(o); // value argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3689 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3690 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3691 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3692 if (tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3693 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3694 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3695 ea = ea->castTo(tvp->valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3696 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3697 tiargs->data[i] = (Object *)ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3698 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3699 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3700 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3701
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3702 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3703 printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3704 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3705 return tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3706 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3707
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 /*****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3710 * Determines if a TemplateInstance will need a nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3711 * generation of the TemplateDeclaration.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3712 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3713
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3714 int TemplateInstance::hasNestedArgs(Objects *args)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3715 { int nested = 0;
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3716 //printf("TemplateInstance::hasNestedArgs('%s')\n", tempdecl->ident->toChars());
336
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 /* A nested instance happens when an argument references a local
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3719 * symbol that is on the stack.
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 for (size_t i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3722 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3723 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3724 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3725 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3726 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3727 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3728 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3729 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3730 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3731 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3732 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3733 if (ea->op == TOKfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3734 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3735 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3736 goto Lsa;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3739 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3740 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3741 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3742 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3743 if (d && !d->isDataseg() &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3744 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3745 !(d->storage_class & STCmanifest) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3746 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3747 (!d->isFuncDeclaration() || d->isFuncDeclaration()->isNested()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3748 !isTemplateMixin())
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 module level template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3751 if (tempdecl->toParent()->isModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3752 { Dsymbol *dparent = d->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3753 if (!isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3754 isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3755 else if (isnested != dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3756 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3757 /* Select the more deeply nested of the two.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3758 * Error if one is not nested inside the other.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3759 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3760 for (Dsymbol *p = isnested; p; p = p->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3761 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3762 if (p == dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3763 goto L1; // isnested is most nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3764 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3765 for (Dsymbol *p = dparent; p; p = p->parent)
336
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 if (p == isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3768 { isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3769 goto L1; // dparent is most nested
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 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3772 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
3773 toChars(), isnested->toChars(), dparent->toChars());
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 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3776 //printf("\tnested inside %s\n", isnested->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3777 nested |= 1;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3780 error("cannot use local '%s' as template parameter", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3781 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3782 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3783 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3784 {
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3785 nested |= hasNestedArgs(&va->objects);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3786 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3787 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3788 return nested;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3791 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3792 * This instance needs an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3793 * Create one by taking the template declaration name and adding
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3794 * the type signature for it.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3795 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3796
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3797 Identifier *TemplateInstance::genIdent()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3798 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3799 char *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3800 Objects *args;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3801
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3802 //printf("TemplateInstance::genIdent('%s')\n", tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3803 id = tempdecl->ident->toChars();
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3804 buf.printf("__T%zu%s", strlen(id), id);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3805 args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3806 for (int i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3807 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3808 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3809 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3810 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3811 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3812 //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
3813 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3814 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3815 buf.writeByte('T');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3816 if (ta->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3817 buf.writestring(ta->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3818 else
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 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3821 printf("ta = %d, %s\n", ta->ty, ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3822 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3823 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3824 }
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 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3827 { sinteger_t v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3828 real_t r;
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 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3831 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3832 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3833 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3834 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3835 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3836 if (ea->op == TOKfunction)
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 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3839 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3840 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3841 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3842 buf.writeByte('V');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3843 if (ea->op == TOKtuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3844 { ea->error("tuple is not a valid template value argument");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3845 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3846 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3847 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3848 /* Use deco that matches what it would be for a function parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3849 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3850 buf.writestring(ea->type->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3851 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3852 // Use type of parameter, not type of argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3853 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3854 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3855 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3856 assert(tvp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3857 buf.writestring(tvp->valType->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3858 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3859 ea->toMangleBuffer(&buf);
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 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3862 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3863 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3864 buf.writeByte('S');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3865 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3866 if (d && !d->type->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3867 error("forward reference of %s", d->toChars());
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 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3870 char *p = sa->mangle();
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1089
diff changeset
3871 buf.printf("%zu%s", strlen(p), p);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3872 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3873 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3874 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3875 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3876 assert(i + 1 == args->dim); // must be last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3877 args = &va->objects;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3878 i = -1;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3881 assert(0);
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 buf.writeByte('Z');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3884 id = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3885 buf.data = NULL;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3886 //printf("\tgenIdent = %s\n", id);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3887 return new Identifier(id, TOKidentifier);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3890
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3891 /****************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3892 * Declare parameters of template instance, initialize them with the
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3893 * template instance arguments.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3894 */
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 void TemplateInstance::declareParameters(Scope *scope)
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 //printf("TemplateInstance::declareParameters()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3899 for (int i = 0; i < tdtypes.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3900 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3901 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3902 //Object *o = (Object *)tiargs->data[i];
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3903 Object *o = (Object *)tdtypes.data[i]; // initializer for tp
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3904
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3905 //printf("\ttdtypes[%d] = %p\n", i, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3906 tempdecl->declareParameter(scope, tp, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3907 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3908 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3911 void TemplateInstance::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3912 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3913
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3914 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3915 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3916 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3917 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3918 printf("+TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3919 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3920 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3921 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3922 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3923 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3924 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3925 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
3926 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3927 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3928 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3929 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3930 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3931 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3932 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3933 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3934 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3935 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3936 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3937 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3938 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3939 printf("-TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3940 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3943 void TemplateInstance::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3944 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3945 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3946 printf("TemplateInstance::semantic3('%s'), semanticdone = %d\n", toChars(), semanticdone);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3947 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3948 //if (toChars()[0] == 'D') *(char*)0=0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3949 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3950 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3951 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3952 if (!errors && members)
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 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3955 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3956 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
3957 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3958 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3959 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3960 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3961 s->semantic3(sc);
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 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3964 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3965 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3966 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3967
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3968 #if IN_DMD
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3969
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3970 void TemplateInstance::toObjFile(int multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3971 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3972 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3973 printf("TemplateInstance::toObjFile('%s', this = %p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3974 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3975 if (!errors && members)
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 if (multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3978 // Append to list of object files to be written later
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3979 //obj_append(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3980 assert(0 && "multiobj");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3981 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3982 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3983 for (int i = 0; i < members->dim; i++)
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 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3986 s->toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3987 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3988 }
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
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3992 #endif
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
3993
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3994 void TemplateInstance::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3995 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3996 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3997 printf("TemplateInstance::inlineScan('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3998 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3999 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4000 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4001 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4002 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4003 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4004 s->inlineScan();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4005 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4006 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4009 void TemplateInstance::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4010 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4011 int i;
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 Identifier *id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4014 buf->writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4015 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4016 if (nest)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4017 buf->writestring("...");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4018 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4019 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4020 nest++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4021 Objects *args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4022 for (i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4023 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4024 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4025 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4026 Object *oarg = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4027 ObjectToCBuffer(buf, hgs, oarg);
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 nest--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4030 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4031 buf->writeByte(')');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4032 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4033
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 Dsymbol *TemplateInstance::toAlias()
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4038 printf("TemplateInstance::toAlias()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4039 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4040 if (!inst)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4041 { error("cannot resolve forward reference");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4042 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4043 }
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 if (inst != this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4046 return inst->toAlias();
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 if (aliasdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4049 return aliasdecl->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4050
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4051 return inst;
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 AliasDeclaration *TemplateInstance::isAliasDeclaration()
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 return aliasdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4057 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4058
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4059 const char *TemplateInstance::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4060 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4061 return "template instance";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4062 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4063
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4064 int TemplateInstance::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4065 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4066 *ps = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4067 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4068 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4069
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4070 char *TemplateInstance::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4071 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4072 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4073 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4074 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4075
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4076 toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4077 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4078 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4079 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4080 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4081
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4082 void TemplateInstance::printInstantiationTrace()
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4083 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4084 if(global.gag)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4085 return;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4086
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4087 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
4088
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4089 // determine instantiation depth
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4090 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
4091 TemplateInstance* cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4092 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
4093 ++n_instantiations;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4094
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4095 // 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
4096 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
4097 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4098 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4099 while(cur)
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 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
4102 cur = cur->tinst;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4103 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4104 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4105 else
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4106 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4107 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4108 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
4109 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
4110 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
4111 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
4112 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
4113 {}
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4114 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
4115 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
4116 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4117 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4118
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4119 /* ======================== TemplateMixin ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4120
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4121 TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, Type *tqual,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4122 Array *idents, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4123 : TemplateInstance(loc, (Identifier *)idents->data[idents->dim - 1])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4124 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4125 //printf("TemplateMixin(ident = '%s')\n", ident ? ident->toChars() : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4126 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4127 this->tqual = tqual;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4128 this->idents = idents;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4129 this->tiargs = tiargs ? tiargs : new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4130 this->scope = NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4133 Dsymbol *TemplateMixin::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4134 { TemplateMixin *tm;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4136 Array *ids = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4137 ids->setDim(idents->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4138 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4139 { // Matches TypeQualified::syntaxCopyHelper()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4140 Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4141 if (id->dyncast() == DYNCAST_DSYMBOL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4142 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4143 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4144
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4145 ti = (TemplateInstance *)ti->syntaxCopy(NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4146 id = (Identifier *)ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4147 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4148 ids->data[i] = id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4149 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4150
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4151 tm = new TemplateMixin(loc, ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4152 (Type *)(tqual ? tqual->syntaxCopy() : NULL),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4153 ids, tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4154 TemplateInstance::syntaxCopy(tm);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4155 return tm;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4156 }
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 void TemplateMixin::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4159 {
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("+TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4162 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4163 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4164 if (semanticdone &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4165 // This for when a class/struct contains mixin members, and
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4166 // is done over because of forward references
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4167 (!parent || !toParent()->isAggregateDeclaration()))
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4170 printf("\tsemantic done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4171 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4172 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4173 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4174 if (!semanticdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4175 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4176 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4177 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4178 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4179
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4180 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4181 // dont know what this is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4182 util_progress();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4183 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4185 Scope *scx = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4186 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4187 { sc = scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4188 scx = scope; // save so we don't make redundant copies
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4189 scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4190 }
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 // Follow qualifications to find the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4193 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4194 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4195 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4196 Identifier *id;
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 if (tqual)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4199 { s = tqual->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4200 i = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4201 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4202 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4203 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4204 i = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4205 id = (Identifier *)idents->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4206 switch (id->dyncast())
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 case DYNCAST_IDENTIFIER:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4209 s = sc->search(loc, id, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4210 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4211
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4212 case DYNCAST_DSYMBOL:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4213 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4214 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4215 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4216 s = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4217 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4218 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4219 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4220 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4221 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4222 }
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 for (; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4225 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4226 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4227 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4228 id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4229 s = s->searchX(loc, sc, id);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4230 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4231 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4232 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4233 error("is not defined");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4234 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4235 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4236 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4237 tempdecl = s->toAlias()->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4238 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4239 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4240 error("%s isn't a template", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4241 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4242 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4243 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4244 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4245
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4246 // Look for forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4247 assert(tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4248 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4249 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4250 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4251 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4252 /* Cannot handle forward references if mixin is a struct member,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4253 * because addField must happen during struct's semantic, not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4254 * during the mixin semantic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4255 * runDeferred will re-run mixin's semantic outside of the struct's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4256 * semantic.
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 semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4259 AggregateDeclaration *ad = toParent()->isAggregateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4260 if (ad)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4261 ad->sizeok = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4262 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4263 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4264 // Forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4265 //printf("forward reference - deferring\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4266 scope = scx ? scx : new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4267 scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4268 scope->module->addDeferredSemantic(this);
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 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4271 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4274 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4275 semanticTiargs(sc);
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 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4278 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4279 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4280 return; // error recovery
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4283 if (!ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4284 ident = genIdent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4285
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4286 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4287 parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4288
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4289 /* Detect recursive mixin instantiations.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4290 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4291 for (Dsymbol *s = parent; s; s = s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4292 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4293 //printf("\ts = '%s'\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4294 TemplateMixin *tm = s->isTemplateMixin();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4295 if (!tm || tempdecl != tm->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4296 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4298 /* Different argument list lengths happen with variadic args
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4299 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4300 if (tiargs->dim != tm->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4301 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4302
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4303 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4304 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4305 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4306 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4307 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4308 Object *tmo = (Object *)tm->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4309 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4310 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4311 Type *tmta = isType(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4312 if (!tmta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4313 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4314 if (!ta->equals(tmta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4315 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4316 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4317 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4318 { Expression *tme = isExpression(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4319 if (!tme || !ea->equals(tme))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4320 goto Lcontinue;
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 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4323 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4324 Dsymbol *tmsa = isDsymbol(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4325 if (sa != tmsa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4326 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4327 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4328 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4329 assert(0);
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 error("recursive mixin instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4332 return;
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 Lcontinue:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4335 continue;
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 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4339 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4340 if (!members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4341 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4342
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4343 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4344
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4345 for (Scope *sce = sc; 1; sce = sce->enclosing)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4346 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4347 ScopeDsymbol *sds = (ScopeDsymbol *)sce->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4348 if (sds)
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 sds->importScope(this, PROTpublic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4351 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4352 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4353 }
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4356 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4357 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4358 Scope *scy = sc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4359 scy = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4360 scy->parent = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4361
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4362 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4363 argsym->parent = scy->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4364 Scope *scope = scy->push(argsym);
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 unsigned errorsave = global.errors;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4367
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4368 // Declare each template parameter as an alias for the argument type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4369 declareParameters(scope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4370
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4371 // Add members to enclosing scope, as well as this scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4372 for (unsigned i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4373 { Dsymbol *s;
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 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4376 s->addMember(scope, this, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4377 //sc->insert(s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4378 //printf("sc->parent = %p, sc->scopesym = %p\n", sc->parent, sc->scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4379 //printf("s->parent = %s\n", s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4380 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4381
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4382 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4383 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4384 printf("\tdo semantic() on template instance members '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4385 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4386 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4387 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4388 sc2->offset = sc->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4389 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4390 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4391 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4392 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4393 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4394 sc->offset = sc2->offset;
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 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4397 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4398 * for initializers inside a function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4399 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4400 // if (sc->parent->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4401
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4402 semantic2(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4403
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4404 if (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4405 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4406 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4407 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4408
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4409 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4410 if (global.errors != errorsave)
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 error("error instantiating");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4413 }
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 sc2->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4416
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4417 scope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4418
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4419 // if (!isAnonymous())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4420 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4421 scy->pop();
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4424 printf("-TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4425 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4426 }
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 void TemplateMixin::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4429 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4430
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4431 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4432 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4433 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4434 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4435 printf("+TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4436 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4437 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4438 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4439 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4440 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4441 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4442 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4443 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4444 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4445 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4446 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4447 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4448 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4449 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4450 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4451 sc->pop();
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4454 printf("-TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4455 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4458 void TemplateMixin::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4459 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4460
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4461 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4462 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4463 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4464 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4465 printf("TemplateMixin::semantic3('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4466 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4467 if (members)
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 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4470 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4471 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4472 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4473 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4474 s->semantic3(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4475 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4476 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4477 sc->pop();
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4481 void TemplateMixin::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4482 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4483 TemplateInstance::inlineScan();
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4486 const char *TemplateMixin::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4487 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4488 return "mixin";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4489 }
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 int TemplateMixin::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4492 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4493 return Dsymbol::oneMember(ps);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4496 int TemplateMixin::hasPointers()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4497 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4498 //printf("TemplateMixin::hasPointers() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4499 for (size_t i = 0; i < members->dim; i++)
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 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4502 //printf(" s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4503 if (s->hasPointers())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4504 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4505 return 1;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4508 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4509 }
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 char *TemplateMixin::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4512 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4513 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4514 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4515 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4516
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4517 TemplateInstance::toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4518 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4519 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4520 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4521 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4522
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4523 void TemplateMixin::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4524 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4525 buf->writestring("mixin ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4526
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4527 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4528 { Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4529
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4530 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4531 buf->writeByte('.');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4532 buf->writestring(id->toChars());
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 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4535 if (tiargs)
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 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4538 { if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4539 buf->writebyte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4540 Object *oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4541 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4542 Expression *e = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4543 Dsymbol *s = isDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4544 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4545 t->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4546 else if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4547 e->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4548 else if (s)
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 char *p = s->ident ? s->ident->toChars() : s->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4551 buf->writestring(p);
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 else if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4554 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4555 buf->writestring("NULL");
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4558 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4559 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4560 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4561 }
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 buf->writebyte(')');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4564 if (ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4565 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4566 buf->writebyte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4567 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4568 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4569 buf->writebyte(';');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4570 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4571 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4572
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4573
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
4574 #if IN_DMD
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4575 void TemplateMixin::toObjFile(int multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4576 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4577 //printf("TemplateMixin::toObjFile('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4578 TemplateInstance::toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4579 }
1147
dbe4af57b240 Changed use of toObjFile to a new codegen method.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1146
diff changeset
4580 #endif