annotate dmd/template.c @ 948:780530d1cad3

Revert templates to old behavior. While emitting a template instantiation only once is good for compile times and binary sizes, it doesn't work with linkonce linkage as inlined function bodies could be discarded. Since we don't want to inhibit inlining, templates are reverted to the previous behavior, where an instantiation is emitted for each module using it. In the future, a custom inlining pass may allow us to switch back to common/weak linkage and reenable smart template instance emission.
author Christian Kamm <kamm incasoftware de>
date Sun, 08 Feb 2009 21:44:46 +0100
parents 1714836f2c0b
children 7ce8355fbcc6
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
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"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
24 #include "mem.h"
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
189 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
190 else if (v1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
191 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
192 if (!v2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
193 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
194 if (v1->objects.dim != v2->objects.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
195 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
196 for (size_t i = 0; i < v1->objects.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
197 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
198 if (!match((Object *)v1->objects.data[i],
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
199 (Object *)v2->objects.data[i],
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
200 tempdecl, sc))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
201 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
202 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
203 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
204 //printf("match\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
205 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
206 Lnomatch:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
207 //printf("nomatch\n");
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
208 return 0; // nomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
209 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
210
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
211 /****************************************
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
214 void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
215 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
216 //printf("ObjectToCBuffer()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
217 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
218 Expression *e = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
219 Dsymbol *s = isDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
220 Tuple *v = isTuple(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
221 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
222 { //printf("\tt: %s ty = %d\n", t->toChars(), t->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
223 t->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
224 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
225 else if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
226 e->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
227 else if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
228 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
229 char *p = s->ident ? s->ident->toChars() : s->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
230 buf->writestring(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
231 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
232 else if (v)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
233 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
234 Objects *args = &v->objects;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
235 for (size_t i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
236 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
237 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
238 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
239 Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
240 ObjectToCBuffer(buf, hgs, o);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
243 else if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
244 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
245 buf->writestring("NULL");
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
248 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
249 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
250 printf("bad Object = %p\n", oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
251 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
252 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
253 }
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
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
258 /* ======================== TemplateDeclaration ============================= */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
259
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
260 TemplateDeclaration::TemplateDeclaration(Loc loc, Identifier *id, TemplateParameters *parameters, Array *decldefs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
261 : ScopeDsymbol(id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
262 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
263 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
264 printf("TemplateDeclaration(this = %p, id = '%s')\n", this, id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
265 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
266 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
267 if (parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
268 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
269 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
270 //printf("\tparameter[%d] = %p\n", i, tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
271 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
272
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
273 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
274 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
275 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
276 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
277 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
278 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
279 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
280 this->parameters = parameters;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
281 this->origParameters = parameters;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
282 this->members = decldefs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
283 this->overnext = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
284 this->overroot = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
285 this->scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
286 this->onemember = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
287 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
288
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
289 Dsymbol *TemplateDeclaration::syntaxCopy(Dsymbol *)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
290 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
291 //printf("TemplateDeclaration::syntaxCopy()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
292 TemplateDeclaration *td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
293 TemplateParameters *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
294 Array *d;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
295
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
296 p = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
297 if (parameters)
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 p = new TemplateParameters();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
300 p->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
301 for (int i = 0; i < p->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
302 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
303 p->data[i] = (void *)tp->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
304 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
305 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
306 d = Dsymbol::arraySyntaxCopy(members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
307 td = new TemplateDeclaration(loc, ident, p, d);
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
308
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 561
diff changeset
309 // LDC
527
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
310 td->intrinsicName = intrinsicName;
cecfee2d01a8 Added support for overloaded intrinsics.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
311
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
312 return td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
313 }
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 void TemplateDeclaration::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
316 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
317 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
318 printf("TemplateDeclaration::semantic(this = %p, id = '%s')\n", this, ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
319 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
320 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
321 return; // semantic() already run
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 if (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
324 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
325 #if DMDV1
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
326 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
327 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
328 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
329
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
330 if (/*global.params.useArrayBounds &&*/ sc->module)
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 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
333 // when template is instantiated in other modules
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
334 sc->module->toModuleArray();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
335 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
337 if (/*global.params.useAssert &&*/ sc->module)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
338 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
339 // Generate this function as it may be used
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
340 // when template is instantiated in other modules
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
341 sc->module->toModuleAssert();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
342 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
343
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
344 /* Remember Scope for later instantiations, but make
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
345 * a copy since attributes can change.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
346 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
347 this->scope = new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
348 this->scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
349
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
350 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
351 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
352 paramsym->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
353 Scope *paramscope = sc->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
354 paramscope->parameterSpecialization = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
355
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
356 if (global.params.doDocComments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
357 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
358 origParameters = new TemplateParameters();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
359 origParameters->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
360 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
361 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
362 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
363 origParameters->data[i] = (void *)tp->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
364 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
367 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
369 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
370
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
371 tp->declareParameter(paramscope);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
374 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
375 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
376 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
377
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
378 tp->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
379 if (i + 1 != parameters->dim && tp->isTemplateTupleParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
380 error("template tuple parameter must be last one");
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
383 paramscope->pop();
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 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
386 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
387 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
388 if (Dsymbol::oneMembers(members, &s))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
389 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
390 if (s && s->ident && s->ident->equals(ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
391 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
392 onemember = s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
393 s->parent = this;
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 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
398 /* BUG: should check:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
399 * o no virtual functions or non-static data members of classes
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
402
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
403 const char *TemplateDeclaration::kind()
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 return (onemember && onemember->isAggregateDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
406 ? onemember->kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
407 : (char *)"template";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
408 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
409
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
410 /**********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
411 * Overload existing TemplateDeclaration 'this' with the new one 's'.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
412 * Return !=0 if successful; i.e. no conflict.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
413 */
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 int TemplateDeclaration::overloadInsert(Dsymbol *s)
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 TemplateDeclaration **pf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
418 TemplateDeclaration *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
419
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
420 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
421 printf("TemplateDeclaration::overloadInsert('%s')\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
422 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
423 f = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
424 if (!f)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
425 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
426 TemplateDeclaration *pthis = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
427 for (pf = &pthis; *pf; pf = &(*pf)->overnext)
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 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
430 // Conflict if TemplateParameter's match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
431 // Will get caught anyway later with TemplateInstance, but
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
432 // should check it now.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
433 TemplateDeclaration *f2 = *pf;
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 if (f->parameters->dim != f2->parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
436 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
437
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
438 for (int i = 0; i < f->parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
439 { TemplateParameter *p1 = (TemplateParameter *)f->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
440 TemplateParameter *p2 = (TemplateParameter *)f2->parameters->data[i];
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 if (!p1->overloadMatch(p2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
443 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
444 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
445
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
446 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
447 printf("\tfalse: conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
448 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
449 return FALSE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
450
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
451 Lcontinue:
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
454 }
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 f->overroot = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
457 *pf = f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
458 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
459 printf("\ttrue: no conflict\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
460 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
461 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
462 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
463
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
464 /***************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
465 * Given that ti is an instance of this TemplateDeclaration,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
466 * deduce the types of the parameters to this, and store
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
467 * those deduced types in dedtypes[].
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
468 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
469 * flag 1: don't do semantic() because of dummy types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
470 * 2: don't change types in matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
471 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
472 * dedtypes deduced arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
473 * Return match level.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
474 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
475
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
476 MATCH TemplateDeclaration::matchWithInstance(TemplateInstance *ti,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
477 Objects *dedtypes, int flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
478 { MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
479 int dedtypes_dim = dedtypes->dim;
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 #define LOGM 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
482 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
483 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
484 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
485
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
486 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
487 printf("dedtypes->dim = %d, parameters->dim = %d\n", dedtypes_dim, parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
488 if (ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
489 printf("ti->tiargs->dim = %d, [0] = %p\n",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
490 ti->tiargs->dim,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
491 ti->tiargs->data[0]);
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 dedtypes->zero();
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 int parameters_dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
496 int variadic = isVariadic() != NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
497
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
498 // If more arguments than parameters, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
499 if (ti->tiargs->dim > parameters_dim && !variadic)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
500 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
501 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
502 printf(" no match: more arguments than parameters\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
503 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
504 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
505 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
506
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
507 assert(dedtypes_dim == parameters_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
508 assert(dedtypes_dim >= ti->tiargs->dim || variadic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
509
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
510 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
511 assert((size_t)scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
512 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
513 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
514 Scope *paramscope = scope->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
515
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
516 // Attempt type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
517 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
518 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
519 { MATCH m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
520 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
521 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
522
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
523 //printf("\targument [%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
524 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
525 //printf("\targument [%d] is %s\n", i, oarg ? oarg->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
526 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
527 if (ttp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
528 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
529 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
530
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
531 #if DMDV1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
532 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
533 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
534 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
535
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
536 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
537 //printf("\tm2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
538
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
539 if (m2 == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
540 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
541 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
542 printf("\tmatchArg() for parameter %i failed\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
543 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
544 goto Lnomatch;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
547 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
548 m = m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
549
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
550 if (!flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
551 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
552 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
553 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
554 }
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 if (!flag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
557 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
558 /* 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
559 * its corresponding arg
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
560 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
561 for (int i = 0; i < dedtypes_dim; i++)
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 if (!dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
564 { assert(i < ti->tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
565 dedtypes->data[i] = ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
566 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
567 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
568 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
569
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
570 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
571 if (m && constraint && !(flag & 1))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
572 { /* Check to see if constraint is satisfied.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
573 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
574 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
575 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
576 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
577 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
578 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
579 ;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
580 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
581 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
582 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
583 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
584 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
585 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
586 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
587 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
588
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
589 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
590 // Print out the results
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
591 printf("--------------------------\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
592 printf("template %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
593 printf("instance %s\n", ti->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
594 if (m)
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 for (int i = 0; i < dedtypes_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
597 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
598 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
599 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
600
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
601 printf(" [%d]", 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 (i < ti->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
604 oarg = (Object *)ti->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
605 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
606 oarg = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
607 tp->print(oarg, (Object *)dedtypes->data[i]);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
610 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
611 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
612 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
613
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
614 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
615 printf(" match = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
616 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
617 goto Lret;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
618
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
619 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
620 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
621 printf(" no match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
622 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
623 m = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
624
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
625 Lret:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
626 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
627 #if LOGM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
628 printf("-TemplateDeclaration::matchWithInstance(this = %p, ti = %p) = %d\n", this, ti, m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
629 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
630 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
631 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
632
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
633 /********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
634 * Determine partial specialization order of 'this' vs td2.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
635 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
636 * 1 this is at least as specialized as td2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
637 * 0 td2 is more specialized than this
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
638 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
639
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
640 int TemplateDeclaration::leastAsSpecialized(TemplateDeclaration *td2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
641 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
642 /* This works by taking the template parameters to this template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
643 * declaration and feeding them to td2 as if it were a template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
644 * instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
645 * If it works, then this template is at least as specialized
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
646 * as td2.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
647 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
648
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
649 TemplateInstance ti(0, ident); // create dummy template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
650 Objects dedtypes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
651
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
652 #define LOG_LEASTAS 0
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 LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
655 printf("%s.leastAsSpecialized(%s)\n", toChars(), td2->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
658 // Set type arguments to dummy template instance to be types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
659 // generated from the parameters to this template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
660 ti.tiargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
661 ti.tiargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
662 for (int i = 0; i < ti.tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
663 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
664 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
665
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
666 void *p = tp->dummyArg();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
667 if (p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
668 ti.tiargs->data[i] = p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
669 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
670 ti.tiargs->setDim(i);
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 // Temporary Array to hold deduced types
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
674 //dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
675 dedtypes.setDim(td2->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
677 // Attempt a type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
678 if (td2->matchWithInstance(&ti, &dedtypes, 1))
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 /* A non-variadic template is more specialized than a
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
681 * variadic one.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
682 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
683 if (isVariadic() && !td2->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
684 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
685
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
686 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
687 printf(" matches, so is least as specialized\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
688 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
689 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
690 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
691 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
692 #if LOG_LEASTAS
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
693 printf(" doesn't match, so is not as specialized\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
695 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
696 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
699 /*************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
700 * Match function arguments against a specific template function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
701 * Input:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
702 * loc instantiation location
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
703 * 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
704 * ethis 'this' argument if !NULL
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
705 * fargs arguments to function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
706 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
707 * dedargs Expression/Type deduced template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
708 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
709 * match level
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
710 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
711
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
712 MATCH TemplateDeclaration::deduceFunctionTemplateMatch(Loc loc, Objects *targsi,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
713 Expression *ethis, Expressions *fargs,
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
714 Objects *dedargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
715 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
716 size_t i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
717 size_t nfparams;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
718 size_t nfargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
719 size_t nargsi; // array size of targsi
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
720 int fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
721 int tuple_dim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
722 MATCH match = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
723 FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
724 TypeFunction *fdtype; // type of fd
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
725 TemplateTupleParameter *tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
726 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
727
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
728 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
729 printf("\nTemplateDeclaration::deduceFunctionTemplateMatch() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
730 for (i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
731 { Expression *e = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
732 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
733 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
736 assert((size_t)scope > 0x10000);
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 dedargs->setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
739 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
740
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
741 dedtypes.setDim(parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
742 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
743
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
744 // Set up scope for parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
745 ScopeDsymbol *paramsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
746 paramsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
747 Scope *paramscope = scope->push(paramsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
748
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
749 tp = isVariadic();
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 nargsi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
752 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
753 { // Set initial template arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
754
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
755 nargsi = targsi->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
756 if (nargsi > parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
757 { if (!tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
758 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
759 dedargs->setDim(nargsi);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
760 dedargs->zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
761 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
762
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
763 memcpy(dedargs->data, targsi->data, nargsi * sizeof(*dedargs->data));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
764
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
765 for (i = 0; i < nargsi; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
766 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
767 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
768 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
769
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
770 m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
771 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
772 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
773 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
774 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
775 match = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
776
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
777 sparam->semantic(paramscope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
778 if (!paramscope->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
779 goto Lnomatch;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
782
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
783 assert(fd->type->ty == Tfunction);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
784 fdtype = (TypeFunction *)fd->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
785
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
786 nfparams = Argument::dim(fdtype->parameters); // number of function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
787 nfargs = fargs->dim; // number of function arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
788
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
789 /* Check for match of function arguments with variadic template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
790 * parameter, such as:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
791 *
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
792 * template Foo(T, A...) { void Foo(T t, A a); }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
793 * void main() { Foo(1,2,3); }
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 tp = isVariadic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
796 if (tp) // if variadic
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
797 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
798 if (nfparams == 0) // if no function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
799 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
800 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
801 //printf("t = %p\n", t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
802 dedargs->data[parameters->dim - 1] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
803 goto L2;
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 else if (nfargs < nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
806 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
807 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
808 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
809 /* Figure out which of the function parameters matches
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
810 * the tuple template parameter. Do this by matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
811 * type identifiers.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
812 * Set the index of this function parameter to fptupindex.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
813 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
814 for (fptupindex = 0; fptupindex < nfparams; fptupindex++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
815 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
816 Argument *fparam = (Argument *)fdtype->parameters->data[fptupindex];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
817 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
818 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
819 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
820 if (!tp->ident->equals(tid->ident) || tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
821 continue;
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 if (fdtype->varargs) // variadic function doesn't
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
824 goto Lnomatch; // go with variadic template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
825
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
826 /* The types of the function arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
827 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
828 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
829 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
830 dedargs->data[parameters->dim - 1] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
831
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
832 tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
833 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
834 for (i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
835 { Expression *farg = (Expression *)fargs->data[fptupindex + i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
836 t->objects.data[i] = (void *)farg->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
837 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
838 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
839 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
840 fptupindex = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
841 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
842 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
843
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
844 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
845 if (nfparams == nfargs)
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)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
848 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
849 if (fdtype->varargs == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
850 goto Lnomatch; // too many args, no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
851 match = MATCHconvert; // match ... with a conversion
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
852 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
853
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
854 L2:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
855 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
856 // Match 'ethis' to any TemplateThisParameter's
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
857 if (ethis)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
858 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
859 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
860 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
861 TemplateThisParameter *ttp = tp->isTemplateThisParameter();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
862 if (ttp)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
863 { MATCH m;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
864
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
865 Type *t = new TypeIdentifier(0, ttp->ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
866 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
867 if (!m)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
868 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
869 if (m < match)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
870 match = m; // pick worst match
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
871 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
872 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
873 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
874 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
875
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
876 // Loop through the function parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
877 for (i = 0; i < nfparams; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
878 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
879 /* Skip over function parameters which wound up
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
880 * as part of a template tuple parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
881 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
882 if (i == fptupindex)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
883 { if (fptupindex == nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
884 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
885 i += tuple_dim - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
886 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
887 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
888
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
889 Argument *fparam = Argument::getNth(fdtype->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
890
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
891 if (i >= nfargs) // if not enough arguments
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
892 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
893 if (fparam->defaultArg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
894 { /* Default arguments do not participate in template argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
895 * deduction.
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 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
898 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
899 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
900 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
901 { Expression *farg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
902 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
903 printf("\tfarg->type = %s\n", farg->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
904 printf("\tfparam->type = %s\n", fparam->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
905 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
906
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
907 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
908 m = farg->type->deduceType(scope, fparam->type, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
909 //printf("\tdeduceType m = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
910
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
911 /* If no match, see if there's a conversion to a delegate
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
912 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
913 if (!m && fparam->type->toBasetype()->ty == Tdelegate)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
914 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
915 TypeDelegate *td = (TypeDelegate *)fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
916 TypeFunction *tf = (TypeFunction *)td->next;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
917
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
918 if (!tf->varargs && Argument::dim(tf->parameters) == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
919 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
920 m = farg->type->deduceType(scope, tf->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
921 if (!m && tf->next->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
922 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
923 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
924 //printf("\tm2 = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
925 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
926
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
927 if (m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
928 { if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
929 match = m; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
930 continue;
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 }
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 /* The following code for variadic arguments closely
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
935 * matches TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
936 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
937 if (!(fdtype->varargs == 2 && i + 1 == nfparams))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
938 goto Lnomatch;
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 /* Check for match with function parameter T...
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 Type *tb = fparam->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
943 switch (tb->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
944 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
945 // Perhaps we can do better with this, see TypeFunction::callMatch()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
946 case Tsarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
947 { TypeSArray *tsa = (TypeSArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
948 integer_t sz = tsa->dim->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
949 if (sz != nfargs - i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
950 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
951 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
952 case Tarray:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
953 { TypeArray *ta = (TypeArray *)tb;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
954 for (; i < nfargs; i++)
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 Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
957 assert(arg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
958 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
959 /* If lazy array of delegates,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
960 * convert arg(s) to delegate(s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
961 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
962 Type *tret = fparam->isLazyArray();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
963 if (tret)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
964 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
965 if (ta->next->equals(arg->type))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
966 { m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
967 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
968 else
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 m = arg->implicitConvTo(tret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
971 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
972 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
973 if (tret->toBasetype()->ty == Tvoid)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
974 m = MATCHconvert;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
978 else
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 m = arg->type->deduceType(scope, ta->next, parameters, &dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
981 //m = arg->implicitConvTo(ta->next);
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 if (m == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
984 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
985 if (m < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
986 match = m;
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 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
989 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
990 case Tclass:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
991 case Tident:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
992 goto Lmatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
993
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
994 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
995 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
996 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
997 }
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 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1000
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1001 /* Fill in any missing arguments with their defaults.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1002 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1003 for (i = nargsi; i < dedargs->dim; i++)
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 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1006 //printf("tp[%d] = %s\n", i, tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1007 /* For T:T*, the dedargs is the T*, dedtypes is the T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1008 * But for function templates, we really need them to match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1009 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1010 Object *oarg = (Object *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1011 Object *oded = (Object *)dedtypes.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1012 //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1013 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1014 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1015 if (oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1016 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1017 if (tp->specialization())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1018 { /* The specialization can work as long as afterwards
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1019 * the oded == oarg
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 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1022 dedargs->data[i] = (void *)oded;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1023 MATCH m2 = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1024 //printf("m2 = %d\n", m2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1025 if (!m2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1026 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1027 if (m2 < match)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1028 match = m2; // pick worst match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1029 if (dedtypes.data[i] != oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1030 error("specialization not allowed for deduced parameter %s", tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1031 }
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 else
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1034 { oded = tp->defaultArg(loc, paramscope);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1035 if (!oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1036 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1037 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1038 declareParameter(paramscope, tp, oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1039 dedargs->data[i] = (void *)oded;
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
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1043 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1044 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1045 { /* Check to see if constraint is satisfied.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1046 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1047 Expression *e = constraint->syntaxCopy();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1048 paramscope->flags |= SCOPEstaticif;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1049 e = e->semantic(paramscope);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1050 e = e->optimize(WANTvalue | WANTinterpret);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1051 if (e->isBool(TRUE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1052 ;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1053 else if (e->isBool(FALSE))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1054 goto Lnomatch;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1055 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1056 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1057 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
1058 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1059 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1060 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1061
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1062 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1063 for (i = 0; i < dedargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1064 { Type *t = (Type *)dedargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1065 printf("\tdedargs[%d] = %d, %s\n", i, t->dyncast(), t->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1066 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1067 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1068
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1069 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1070 //printf("\tmatch %d\n", match);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1071 return match;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1072
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1073 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1074 paramscope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1075 //printf("\tnomatch\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1076 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1077 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1078
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1079 /**************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1080 * Declare template parameter tp with value o.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1081 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1082
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1083 void TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, Object *o)
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 //printf("TemplateDeclaration::declareParameter('%s', o = %p)\n", tp->ident->toChars(), o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1086
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1087 Type *targ = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1088 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1089 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1090 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1091
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1092 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1093
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1094 if (targ)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1095 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1096 //printf("type %s\n", targ->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1097 s = new AliasDeclaration(0, tp->ident, targ);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1098 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1099 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1100 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1101 //printf("Alias %s %s;\n", sa->ident->toChars(), tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1102 s = new AliasDeclaration(0, tp->ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1103 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1104 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1105 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1106 // tdtypes.data[i] always matches ea here
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1107 Initializer *init = new ExpInitializer(loc, ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1108 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1109 assert(tvp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1110
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1111 VarDeclaration *v = new VarDeclaration(loc, tvp->valType, tp->ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1112 v->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1113 s = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1114 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1115 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1116 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1117 //printf("\ttuple\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1118 s = new TupleDeclaration(loc, tp->ident, &va->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1119 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1120 else
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 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1123 o->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1124 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1125 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1126 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1127 if (!sc->insert(s))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1128 error("declaration %s is already defined", tp->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1129 s->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1130 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1131
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1132 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1133 * Determine if TemplateDeclaration is variadic.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1136 TemplateTupleParameter *isVariadic(TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1137 { size_t dim = parameters->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1138 TemplateTupleParameter *tp = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1139
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1140 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1141 tp = ((TemplateParameter *)parameters->data[dim - 1])->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1142 return tp;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1145 TemplateTupleParameter *TemplateDeclaration::isVariadic()
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 return ::isVariadic(parameters);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1150 /***********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1151 * We can overload templates.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1152 */
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 int TemplateDeclaration::isOverloadable()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1155 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1156 return 1;
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
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 * Given function arguments, figure out which template function
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1161 * to expand, and return that function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1162 * If no match, give error message and return NULL.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1163 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1164 * sc instantiation scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1165 * loc instantiation location
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1166 * targsi initial list of template arguments
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1167 * ethis if !NULL, the 'this' pointer argument
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1168 * fargs arguments to function
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1169 * 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
1170 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1171
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1172 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
1173 Objects *targsi, Expression *ethis, Expressions *fargs, int flags)
336
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 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1176 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1177 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1178 Objects *tdargs = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1179 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1180 FuncDeclaration *fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1181
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1182 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1183 printf("TemplateDeclaration::deduceFunctionTemplate() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1184 printf(" targsi:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1185 if (targsi)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1186 { for (int i = 0; i < targsi->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1187 { Object *arg = (Object *)targsi->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1188 printf("\t%s\n", arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1189 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1190 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1191 printf(" fargs:\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1192 for (int i = 0; i < fargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1193 { Expression *arg = (Expression *)fargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1194 printf("\t%s %s\n", arg->type->toChars(), arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1195 //printf("\tty = %d\n", arg->type->ty);
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 #endif
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 for (TemplateDeclaration *td = this; td; td = td->overnext)
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 if (!td->scope)
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 error("forward reference to template %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1204 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1205 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1206 if (!td->onemember || !td->onemember->toAlias()->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1207 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1208 error("is not a function template");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1209 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1210 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1211
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1212 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1213 Objects dedargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1214
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1215 m = td->deduceFunctionTemplateMatch(loc, targsi, ethis, fargs, &dedargs);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1216 //printf("deduceFunctionTemplateMatch = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1217 if (!m) // if no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1218 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1219
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1220 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1221 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1222 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1223 goto Ltd;
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 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1226 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1227 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1228 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1229 //printf("c1 = %d, c2 = %d\n", c1, c2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1230
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1231 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1232 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1233 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1234 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1235 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1236 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1237 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1239 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1240 td_ambig = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1241 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1242
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1243 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1244 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1245 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1246
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1247 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1248 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1249 assert((size_t)td->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1250 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1251 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1252 tdargs->setDim(dedargs.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1253 memcpy(tdargs->data, dedargs.data, tdargs->dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1254 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1255 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1256 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1257 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1258 error(loc, "does not match any template declaration");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1259 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1260 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1261 if (td_ambig)
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 error(loc, "%s matches more than one function template declaration, %s and %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1264 toChars(), td_best->toChars(), td_ambig->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1265 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1267 /* The best match is td_best with arguments tdargs.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1268 * Now instantiate the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1269 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1270 assert((size_t)td_best->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1271 ti = new TemplateInstance(loc, td_best, tdargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1272 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1273 fd = ti->toAlias()->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1274 if (!fd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1275 goto Lerror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1276 return fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1277
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1278 Lerror:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1279 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1280 HdrGenState hgs;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1281
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1282 OutBuffer bufa;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1283 Objects *args = targsi;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1284 if (args)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1285 { 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
1286 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1287 if (i)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1288 bufa.writeByte(',');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1289 Object *oarg = (Object *)args->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1290 ObjectToCBuffer(&bufa, &hgs, oarg);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1291 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1292 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1293
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1294 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1295 argExpTypesToCBuffer(&buf, fargs, &hgs);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1296 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
1297 bufa.toChars(), buf.toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1298 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1299 return NULL;
336
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1302 void TemplateDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 0 // Should handle template functions
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1305 if (onemember && onemember->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1306 buf->writestring("foo ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1307 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1308 buf->writestring(kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1309 buf->writeByte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1310 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1311 buf->writeByte('(');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1312 for (int i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1313 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1314 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1315 if (hgs->ddoc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1316 tp = (TemplateParameter *)origParameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1317 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1318 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1319 tp->toCBuffer(buf, hgs);
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 buf->writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1322 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1323 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1324 { buf->writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1325 constraint->toCBuffer(buf, hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1326 buf->writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1327 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1328 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1329
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1330 if (hgs->hdrgen)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1331 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1332 hgs->tpltMember++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1333 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1334 buf->writebyte('{');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1335 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1336 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1337 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1338 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1339 s->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1340 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1341 buf->writebyte('}');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1342 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1343 hgs->tpltMember--;
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 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1348 char *TemplateDeclaration::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1349 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1350 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1351
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1352 memset(&hgs, 0, sizeof(hgs));
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 (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1359 buf.writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1360 tp->toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1361 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1362 buf.writeByte(')');
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1363 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1364 if (constraint)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1365 { buf.writestring(" if (");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1366 constraint->toCBuffer(&buf, &hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1367 buf.writeByte(')');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1368 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1369 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1370 buf.writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1371 return (char *)buf.extractData();
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1374 /* ======================== Type ============================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1375
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1376 /****
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1377 * Given an identifier, figure out which TemplateParameter it is.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1378 * Return -1 if not found.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1379 */
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 int templateIdentifierLookup(Identifier *id, TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1382 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1383 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1384 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1385
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1386 if (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1387 return i;
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 return -1;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1392 int templateParameterLookup(Type *tparam, TemplateParameters *parameters)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1393 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1394 assert(tparam->ty == Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1395 TypeIdentifier *tident = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1396 //printf("\ttident = '%s'\n", tident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1397 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1398 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1399 return templateIdentifierLookup(tident->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1400 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1401 return -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1402 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1403
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1404 /* These form the heart of template argument deduction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1405 * Given 'this' being the type argument to the template instance,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1406 * it is matched against the template declaration parameter specialization
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1407 * 'tparam' to determine the type to be used for the parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1408 * Example:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1409 * template Foo(T:T*) // template declaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1410 * Foo!(int*) // template instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1411 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1412 * this = int*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1413 * tparam = T
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1414 * parameters = [ T:T* ] // Array of TemplateParameter's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1415 * Output:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1416 * dedtypes = [ int ] // Array of Expression/Type's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1417 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1418
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1419 MATCH Type::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1420 Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1421 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1422 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1423 printf("Type::deduceType()\n");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1424 printf("\tthis = %d, ", ty); print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1425 printf("\ttparam = %d, ", tparam->ty); tparam->print();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
1426 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1427 if (!tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1428 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1429
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1430 if (this == tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1431 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1432
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1433 if (tparam->ty == Tident)
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 // Determine which parameter tparam is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1436 int i = templateParameterLookup(tparam, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1437 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1438 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1439 if (!sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1440 goto Lnomatch;
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 /* Need a loc to go with the semantic routine.
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 Loc loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1445 if (parameters->dim)
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 TemplateParameter *tp = (TemplateParameter *)parameters->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1448 loc = tp->loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1449 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1450
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1451 /* BUG: what if tparam is a template instance, that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1452 * has as an argument another Tident?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1453 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1454 tparam = tparam->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1455 assert(tparam->ty != Tident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1456 return deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1457 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1458
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1459 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
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 // Found the corresponding parameter tp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1462 if (!tp->isTemplateTypeParameter())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1463 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1464 Type *at = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1465 if (!at)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1466 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1467 dedtypes->data[i] = (void *)this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1468 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1469 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1470 if (equals(at))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1471 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1472 else if (ty == Tclass && at->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1473 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1474 return (MATCH) implicitConvTo(at);
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 else if (ty == Tsarray && at->ty == Tarray &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1477 nextOf()->equals(at->nextOf()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1478 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1479 goto Lexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1480 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1481 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1482 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1483 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1485 if (ty != tparam->ty)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1486 return implicitConvTo(tparam);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1487 // goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1488
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1489 if (nextOf())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1490 return nextOf()->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1491
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1492 Lexact:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1493 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1494
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1495 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1496 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1497 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1498
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1499 MATCH TypeSArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1500 Objects *dedtypes)
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 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1503 printf("TypeSArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1504 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1505 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1506 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1507
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1508 // Extra check that array dimensions must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1509 if (tparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1510 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1511 if (tparam->ty == Tsarray)
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 TypeSArray *tp = (TypeSArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1514
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1515 if (tp->dim->op == TOKvar &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1516 ((VarExp *)tp->dim)->var->storage_class & STCtemplateparameter)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1517 { int i = templateIdentifierLookup(((VarExp *)tp->dim)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1518 // This code matches code in TypeInstance::deduceType()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1519 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1520 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1521 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1522 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1523 if (!tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1524 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1525 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1526 if (e)
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 (!dim->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1529 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1530 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1531 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1532 { Type *vt = tvp->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1533 MATCH m = (MATCH)dim->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1534 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1535 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1536 dedtypes->data[i] = dim;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1539 else if (dim->toInteger() != tp->dim->toInteger())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1540 return MATCHnomatch;
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 else if (tparam->ty == Taarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1543 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1544 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1545 if (tp->index->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1546 { TypeIdentifier *tident = (TypeIdentifier *)tp->index;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1547
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1548 if (tident->idents.dim == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1549 { Identifier *id = tident->ident;
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 for (size_t i = 0; i < parameters->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1552 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1553 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1554
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1555 if (tp->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1556 { // Found the corresponding template parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1557 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1558 if (!tvp || !tvp->valType->isintegral())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1559 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1560
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1561 if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1562 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1563 if (!dim->equals((Object *)dedtypes->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1564 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1565 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1566 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1567 { dedtypes->data[i] = (void *)dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1568 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1569 return next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1572 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1575 else if (tparam->ty == Tarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1576 { MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1577
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1578 m = next->deduceType(sc, tparam->nextOf(), parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1579 if (m == MATCHexact)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1580 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1581 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1582 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1583 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1584 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1585
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1586 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1587 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1588 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1589
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1590 MATCH TypeAArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1591 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1592 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1593 printf("TypeAArray::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1594 printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1595 printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1596 #endif
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 // Extra check that index type must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1599 if (tparam && tparam->ty == Taarray)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1600 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1601 TypeAArray *tp = (TypeAArray *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1602 if (!index->deduceType(sc, tp->index, parameters, dedtypes))
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 return MATCHnomatch;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1607 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1608 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1609
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1610 MATCH TypeFunction::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
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 //printf("TypeFunction::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1613 //printf("\tthis = %d, ", ty); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1614 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
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 // Extra check that function characteristics must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1617 if (tparam && tparam->ty == Tfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1618 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1619 TypeFunction *tp = (TypeFunction *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1620 if (varargs != tp->varargs ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1621 linkage != tp->linkage)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1622 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1623
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1624 size_t nfargs = Argument::dim(this->parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1625 size_t nfparams = Argument::dim(tp->parameters);
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 /* See if tuple match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1628 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1629 if (nfparams > 0 && nfargs >= nfparams - 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1630 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1631 /* See if 'A' of the template parameter matches 'A'
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1632 * of the type of the last function parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1633 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1634 Argument *fparam = (Argument *)tp->parameters->data[nfparams - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1635 if (fparam->type->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1636 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1637 TypeIdentifier *tid = (TypeIdentifier *)fparam->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1638 if (tid->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1639 goto L1;
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 /* Look through parameters to find tuple matching tid->ident
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1642 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1643 size_t tupi = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1644 for (; 1; tupi++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1645 { if (tupi == parameters->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1646 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1647 TemplateParameter *t = (TemplateParameter *)parameters->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1648 TemplateTupleParameter *tup = t->isTemplateTupleParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1649 if (tup && tup->ident->equals(tid->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1650 break;
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 /* The types of the function arguments [nfparams - 1 .. nfargs]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1654 * now form the tuple argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1655 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1656 int tuple_dim = nfargs - (nfparams - 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1657
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1658 /* See if existing tuple, and whether it matches or not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1659 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1660 Object *o = (Object *)dedtypes->data[tupi];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1661 if (o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1662 { // Existing deduced argument must be a tuple, and must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1663 Tuple *t = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1664 if (!t || t->objects.dim != tuple_dim)
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 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1667 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1668 if (!arg->type->equals((Object *)t->objects.data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1669 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1670 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1671 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1672 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1673 { // Create new tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1674 Tuple *t = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1675 t->objects.setDim(tuple_dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1676 for (size_t i = 0; i < tuple_dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1677 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1678 t->objects.data[i] = (void *)arg->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1679 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1680 dedtypes->data[tupi] = (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1681 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1682 nfparams--; // don't consider the last parameter for type deduction
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1683 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1684 }
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 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1687 if (nfargs != nfparams)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1688 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1689 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1690 for (size_t i = 0; i < nfparams; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1691 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1692 Argument *a = Argument::getNth(this->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1693 Argument *ap = Argument::getNth(tp->parameters, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1694 if (a->storageClass != ap->storageClass ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1695 !a->type->deduceType(sc, ap->type, parameters, dedtypes))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1696 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1697 }
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 return Type::deduceType(sc, tparam, parameters, dedtypes);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1702 MATCH TypeIdentifier::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1703 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1704 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1705 if (tparam && tparam->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1706 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1707 TypeIdentifier *tp = (TypeIdentifier *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1708
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1709 for (int i = 0; i < idents.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1710 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1711 Identifier *id1 = (Identifier *)idents.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1712 Identifier *id2 = (Identifier *)tp->idents.data[i];
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 if (!id1->equals(id2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1715 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1716 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1717 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1718 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1719 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1720
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1721 MATCH TypeInstance::deduceType(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1722 Type *tparam, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1723 Objects *dedtypes)
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 //printf("TypeInstance::deduceType(tparam = %s) %s\n", tparam->toChars(), toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1726 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
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 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1729 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1730 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1731 TypeInstance *tp = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1732
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1733 //printf("tempinst->tempdecl = %p\n", tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1734 //printf("tp->tempinst->tempdecl = %p\n", tp->tempinst->tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1735 if (!tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1736 { //printf("tp->tempinst->name = '%s'\n", tp->tempinst->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1737 if (!tp->tempinst->name->equals(tempinst->name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1738 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1739 /* Handle case of:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1740 * template Foo(T : sa!(T), alias sa)
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 int i = templateIdentifierLookup(tp->tempinst->name, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1743 if (i == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1744 { /* Didn't find it as a parameter identifier. Try looking
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1745 * it up and seeing if is an alias. See Bugzilla 1454
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 Dsymbol *s = tempinst->tempdecl->scope->search(0, tp->tempinst->name, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1748 if (s)
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 s = s->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1751 TemplateDeclaration *td = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1752 if (td && td == tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1753 goto L2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1754 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1755 goto Lnomatch;
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 TemplateParameter *tpx = (TemplateParameter *)parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1758 // This logic duplicates tpx->matchArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1759 TemplateAliasParameter *ta = tpx->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1760 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1761 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1762 Dsymbol *sa = tempinst->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1763 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1764 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1765 if (ta->specAlias && sa != ta->specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1766 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1767 if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1768 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1769 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
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 if (s != sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1772 goto Lnomatch;
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 dedtypes->data[i] = sa;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1777 else if (tempinst->tempdecl != tp->tempinst->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1778 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1779
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1780 L2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1781 if (tempinst->tiargs->dim != tp->tempinst->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1782 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1783
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1784 for (int i = 0; i < tempinst->tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1785 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1786 //printf("\ttest: tempinst->tiargs[%d]\n", i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1787 int j;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1788 Object *o1 = (Object *)tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1789 Object *o2 = (Object *)tp->tempinst->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1790
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1791 Type *t1 = isType(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1792 Type *t2 = isType(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1793
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1794 Expression *e1 = isExpression(o1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1795 Expression *e2 = isExpression(o2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1796
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1797 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1798 if (t1) printf("t1 = %s\n", t1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1799 if (t2) printf("t2 = %s\n", t2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1800 if (e1) printf("e1 = %s\n", e1->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1801 if (e2) printf("e2 = %s\n", e2->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1802 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1803
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1804 if (t1 && t2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1805 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1806 if (!t1->deduceType(sc, t2, parameters, dedtypes))
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1809 else if (e1 && e2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1810 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1811 if (!e1->equals(e2))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1812 { if (e2->op == TOKvar)
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 /*
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1815 * (T:Number!(e2), int e2)
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 j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1818 goto L1;
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 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1821 }
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 else if (e1 && t2 && t2->ty == Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1824 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1825 j = templateParameterLookup(t2, parameters);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1826 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1827 if (j == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1828 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1829 TemplateParameter *tp = (TemplateParameter *)parameters->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1830 // BUG: use tp->matchArg() instead of the following
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1831 TemplateValueParameter *tv = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1832 if (!tv)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1833 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1834 Expression *e = (Expression *)dedtypes->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1835 if (e)
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 if (!e1->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1838 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1839 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1840 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1841 { Type *vt = tv->valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1842 MATCH m = (MATCH)e1->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1843 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1844 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1845 dedtypes->data[j] = e1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1846 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1847 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1848 // BUG: Need to handle alias and tuple parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1849 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1850 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1851 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1852 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1853 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1854
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1855 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1856 return MATCHnomatch;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1859 MATCH TypeStruct::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
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 //printf("TypeStruct::deduceType()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1862 //printf("\tthis->parent = %s, ", sym->parent->toChars()); print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1863 //printf("\ttparam = %d, ", tparam->ty); tparam->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1864
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1865 /* If this struct is a template struct, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1866 * it against a template instance, convert the struct type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1867 * to a template instance, too, and try again.
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 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1870
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1871 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1872 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1873 if (ti && ti->toAlias() == sym)
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 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1876 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1877 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1878
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1879 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1880 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1881 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1882 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1883 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1884 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1885 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1886 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1887 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1888 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1889 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1890 /* Slice off the .foo in S!(T).foo
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 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1893 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1894 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1895 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1896 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1897 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1900
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1901 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1902 if (tparam && tparam->ty == Tstruct)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1903 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1904 TypeStruct *tp = (TypeStruct *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1905
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1906 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1907 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1908 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1909 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1910 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1911
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1912 MATCH TypeEnum::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1913 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1914 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1915 if (tparam && tparam->ty == Tenum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1916 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1917 TypeEnum *tp = (TypeEnum *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1918
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1919 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1920 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1921 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1922 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1923 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1924
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1925 MATCH TypeTypedef::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1926 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1927 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1928 if (tparam && tparam->ty == Ttypedef)
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 TypeTypedef *tp = (TypeTypedef *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1931
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1932 if (sym != tp->sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1933 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1934 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1935 return Type::deduceType(sc, tparam, parameters, dedtypes);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1938 MATCH TypeClass::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1939 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1940 //printf("TypeClass::deduceType(this = %s)\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1941
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1942 /* If this class is a template class, and we're matching
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1943 * it against a template instance, convert the class type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1944 * to a template instance, too, and try again.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1945 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1946 TemplateInstance *ti = sym->parent->isTemplateInstance();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1947
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1948 if (tparam && tparam->ty == Tinstance)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1949 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1950 if (ti && ti->toAlias() == sym)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1951 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1952 TypeInstance *t = new TypeInstance(0, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1953 return t->deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1954 }
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 /* Match things like:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1957 * S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1958 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1959 TypeInstance *tpi = (TypeInstance *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1960 if (tpi->idents.dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1961 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1962 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1963 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1964 Type *tparent = sym->parent->getType();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1965 if (tparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1966 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1967 /* Slice off the .foo in S!(T).foo
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1968 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1969 tpi->idents.dim--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1970 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1971 tpi->idents.dim++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1972 return m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1973 }
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 // Extra check
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1979 if (tparam && tparam->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1980 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1981 TypeClass *tp = (TypeClass *)tparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1982
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1983 //printf("\t%d\n", (MATCH) implicitConvTo(tp));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1984 return (MATCH) implicitConvTo(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1985 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1986 return Type::deduceType(sc, tparam, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1987 }
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 /* ======================== TemplateParameter =============================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1990
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1991 TemplateParameter::TemplateParameter(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1992 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1993 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1994 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1995 this->sparam = NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1998 TemplateTypeParameter *TemplateParameter::isTemplateTypeParameter()
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 NULL;
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 TemplateValueParameter *TemplateParameter::isTemplateValueParameter()
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 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2006 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2007
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2008 TemplateAliasParameter *TemplateParameter::isTemplateAliasParameter()
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 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2011 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2012
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2013 TemplateTupleParameter *TemplateParameter::isTemplateTupleParameter()
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 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2016 }
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 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2019 TemplateThisParameter *TemplateParameter::isTemplateThisParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2020 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2021 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2022 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2023 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2024
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2025 /* ======================== TemplateTypeParameter =========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2026
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2027 // type-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2028
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2029 TemplateTypeParameter::TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2030 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2031 : TemplateParameter(loc, ident)
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 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2034 this->specType = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2035 this->defaultType = defaultType;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2038 TemplateTypeParameter *TemplateTypeParameter::isTemplateTypeParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2039 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2040 return this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2043 TemplateParameter *TemplateTypeParameter::syntaxCopy()
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 TemplateTypeParameter *tp = new TemplateTypeParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2046 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2047 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2048 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2049 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2050 return tp;
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 void TemplateTypeParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2054 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2055 //printf("TemplateTypeParameter::declareParameter('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2056 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2057 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2058 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2059 error(loc, "parameter '%s' multiply defined", ident->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2062 void TemplateTypeParameter::semantic(Scope *sc)
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 //printf("TemplateTypeParameter::semantic('%s')\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2065 if (specType)
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 specType = specType->semantic(loc, sc);
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 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2070 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2071 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2072 defaultType = defaultType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2073 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2074 #endif
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
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 * Determine if two TemplateParameters are the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2079 * as far as TemplateDeclaration overloading goes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2080 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2081 * 1 match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2082 * 0 no match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2083 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2084
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2085 int TemplateTypeParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2086 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2087 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2088
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2089 if (ttp)
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 if (specType != ttp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2092 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2093
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2094 if (specType && !specType->equals(ttp->specType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2095 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2096
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2097 return 1; // match
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2100 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2101 return 0;
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
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 * Match to a particular TemplateParameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2106 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2107 * i i'th argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2108 * tiargs[] actual arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2109 * parameters[] template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2110 * dedtypes[] deduced arguments to template instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2111 * *psparam set to symbol declared and initialized to dedtypes[i]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2112 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2113
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2114 MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2115 int i, TemplateParameters *parameters, Objects *dedtypes,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2116 Declaration **psparam)
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 //printf("TemplateTypeParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2119 Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2120 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2121 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2122 Type *ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2123
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2124 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2125 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2126 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2127 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2128 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2129 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2130 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2131 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2132 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2133 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2134 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2135 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2136 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2137
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2138 ta = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2139 if (!ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2140 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2141 //printf("ta is %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2142
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2143 t = (Type *)dedtypes->data[i];
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 if (specType)
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 //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
2148 MATCH m2 = ta->deduceType(sc, specType, parameters, dedtypes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2149 if (m2 == MATCHnomatch)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2150 { //printf("\tfailed deduceType\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2151 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2152 }
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 if (m2 < m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2155 m = m2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2156 t = (Type *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2157 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2158 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2159 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2160 // So that matches with specializations are better
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2161 m = MATCHconvert;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2162 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2163 { // Must match already deduced type
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 m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2166 if (!t->equals(ta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2167 { //printf("t = %s ta = %s\n", t->toChars(), ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2168 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2169 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2170 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2171 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2173 if (!t)
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 dedtypes->data[i] = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2176 t = ta;
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 *psparam = new AliasDeclaration(loc, ident, t);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2179 //printf("\tm = %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2180 return m;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2183 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2184 //printf("\tm = %d\n", MATCHnomatch);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2185 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2186 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2187
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2188
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2189 void TemplateTypeParameter::print(Object *oarg, Object *oded)
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 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2192
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2193 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2194 Type *ta = isType(oded);
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 assert(ta);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2197
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2198 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2199 printf("\tSpecialization: %s\n", specType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2200 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2201 printf("\tDefault: %s\n", defaultType->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2202 printf("\tArgument: %s\n", t ? t->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2203 printf("\tDeduced Type: %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2204 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2205
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2206
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2207 void TemplateTypeParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2208 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2209 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2210 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2211 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2212 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2213 specType->toCBuffer(buf, NULL, hgs);
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 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2216 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2217 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2218 defaultType->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2219 }
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
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 void *TemplateTypeParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2224 { Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2225
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2226 if (specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2227 t = specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2228 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2229 { // Use this for alias-parameter's too (?)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2230 t = new TypeIdentifier(loc, ident);
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 return (void *)t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2233 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2234
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 Object *TemplateTypeParameter::specialization()
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 return specType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2239 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2240
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2241
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2242 Object *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2243 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2244 Type *t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2245
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2246 t = defaultType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2247 if (t)
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 t = t->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2250 t = t->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2251 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2252 return t;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2253 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2254
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2255 /* ======================== TemplateThisParameter =========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2256
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2257 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2258 // this-parameter
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 TemplateThisParameter::TemplateThisParameter(Loc loc, Identifier *ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2261 Type *specType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2262 Type *defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2263 : TemplateTypeParameter(loc, ident, specType, defaultType)
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 TemplateThisParameter *TemplateThisParameter::isTemplateThisParameter()
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 return this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2272 TemplateParameter *TemplateThisParameter::syntaxCopy()
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 TemplateThisParameter *tp = new TemplateThisParameter(loc, ident, specType, defaultType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2275 if (tp->specType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2276 tp->specType = specType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2277 if (defaultType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2278 tp->defaultType = defaultType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2279 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2280 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2282 void TemplateThisParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2283 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2284 buf->writestring("this ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2285 TemplateTypeParameter::toCBuffer(buf, 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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2288
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2289 /* ======================== TemplateAliasParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2290
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2291 // alias-parameter
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 Dsymbol *TemplateAliasParameter::sdummy = NULL;
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 TemplateAliasParameter::TemplateAliasParameter(Loc loc, Identifier *ident, Type *specAliasT, Type *defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2296 : TemplateParameter(loc, ident)
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 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2299 this->specAliasT = specAliasT;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2300 this->defaultAlias = defaultAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2301
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2302 this->specAlias = NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2305 TemplateAliasParameter *TemplateAliasParameter::isTemplateAliasParameter()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2306 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2307 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2308 }
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 TemplateParameter *TemplateAliasParameter::syntaxCopy()
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 TemplateAliasParameter *tp = new TemplateAliasParameter(loc, ident, specAliasT, defaultAlias);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2313 if (tp->specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2314 tp->specAliasT = specAliasT->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2315 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2316 tp->defaultAlias = defaultAlias->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2317 return tp;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2320 void TemplateAliasParameter::declareParameter(Scope *sc)
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 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2323 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2324 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2325 error(loc, "parameter '%s' multiply defined", ident->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2328 void TemplateAliasParameter::semantic(Scope *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 if (specAliasT)
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 specAlias = specAliasT->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2333 if (!specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2334 error(loc, "%s is not a symbol", specAliasT->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2335 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2336 #if 0 // Don't do semantic() until instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2337 if (defaultAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2338 defaultAlias = defaultAlias->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2339 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2340 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2341
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2342 int TemplateAliasParameter::overloadMatch(TemplateParameter *tp)
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 TemplateAliasParameter *tap = tp->isTemplateAliasParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2345
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2346 if (tap)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2347 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2348 if (specAlias != tap->specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2349 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2350
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2351 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2352 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2353
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2354 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2355 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2356 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2357
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2358 MATCH TemplateAliasParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2359 Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2360 Declaration **psparam)
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 Dsymbol *sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2363 Object *oarg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2364 Expression *ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2365
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2366 //printf("TemplateAliasParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2367
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2368 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2369 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2370 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2371 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2372 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2373 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2374 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2375 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2376 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2377 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2378 goto Lnomatch;
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 }
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 sa = getDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2383 if (!sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2384 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2385
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2386 if (specAlias)
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 if (!sa || sa == sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2389 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2390 if (sa != specAlias)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2391 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2392 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2393 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2394 { // Must match already deduced symbol
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2395 Dsymbol *s = (Dsymbol *)dedtypes->data[i];
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 if (!sa || s != sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2398 goto Lnomatch;
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 dedtypes->data[i] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2401
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2402 *psparam = new AliasDeclaration(loc, ident, sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2403 return MATCHexact;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2406 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2407 return MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2408 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2411 void TemplateAliasParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2412 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2413 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2414
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2415 Dsymbol *sa = isDsymbol(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2416 assert(sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2417
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2418 printf("\tArgument alias: %s\n", sa->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2421 void TemplateAliasParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2422 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2423 buf->writestring("alias ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2424 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2425 if (specAliasT)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2426 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2427 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2428 specAliasT->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2429 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2430 if (defaultAlias)
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 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2433 defaultAlias->toCBuffer(buf, NULL, hgs);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2437
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2438 void *TemplateAliasParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2439 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2440
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2441 s = specAlias;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2442 if (!s)
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 if (!sdummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2445 sdummy = new Dsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2446 s = sdummy;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2447 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2448 return (void*)s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2449 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2450
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2451
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2452 Object *TemplateAliasParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2453 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2454 return specAliasT;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2455 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2456
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2457
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2458 Object *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc)
336
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 Dsymbol *s = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2461
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2462 if (defaultAlias)
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 s = defaultAlias->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2465 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2466 error("%s is not a symbol", defaultAlias->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2467 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2468 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2469 }
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 /* ======================== TemplateValueParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2472
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2473 // value-parameter
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 Expression *TemplateValueParameter::edummy = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2476
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2477 TemplateValueParameter::TemplateValueParameter(Loc loc, Identifier *ident, Type *valType,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2478 Expression *specValue, Expression *defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2479 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2480 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2481 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2482 this->valType = valType;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2483 this->specValue = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2484 this->defaultValue = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2485 }
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 TemplateValueParameter *TemplateValueParameter::isTemplateValueParameter()
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 return this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2492 TemplateParameter *TemplateValueParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2493 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2494 TemplateValueParameter *tp =
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2495 new TemplateValueParameter(loc, ident, valType, specValue, defaultValue);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2496 tp->valType = valType->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2497 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2498 tp->specValue = specValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2499 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2500 tp->defaultValue = defaultValue->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2501 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2502 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2503
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2504 void TemplateValueParameter::declareParameter(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2505 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2506 VarDeclaration *v = new VarDeclaration(loc, valType, ident, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2507 v->storage_class = STCtemplateparameter;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2508 if (!sc->insert(v))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2509 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2510 sparam = v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2511 }
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 void TemplateValueParameter::semantic(Scope *sc)
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 sparam->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2516 valType = valType->semantic(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2517 if (!(valType->isintegral() || valType->isfloating() || valType->isString()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2518 valType->ty != Tident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2519 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
2520
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2521 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2522 { Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2523
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2524 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2525 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2526 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2527 if (e->op == TOKint64 || e->op == TOKfloat64 ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2528 e->op == TOKcomplex80 || e->op == TOKnull || e->op == TOKstring)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2529 specValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2530 //e->toInteger();
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2533 #if 0 // defer semantic analysis to arg match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2534 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2535 { Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2536
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2537 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2538 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2539 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2540 if (e->op == TOKint64)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2541 defaultValue = e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2542 //e->toInteger();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2543 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2544 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2547 int TemplateValueParameter::overloadMatch(TemplateParameter *tp)
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 *tvp = tp->isTemplateValueParameter();
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 if (tvp)
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 if (valType != tvp->valType)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2554 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2555
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2556 if (valType && !valType->equals(tvp->valType))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2557 goto Lnomatch;
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 if (specValue != tvp->specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2560 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2561
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2562 return 1; // match
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2566 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2567 }
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 MATCH TemplateValueParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2571 Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2572 Declaration **psparam)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2573 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2574 //printf("TemplateValueParameter::matchArg()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2575
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2576 Initializer *init;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2577 Declaration *sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2578 MATCH m = MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2579 Expression *ei;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2580 Object *oarg;
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 if (i < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2583 oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2584 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2585 { // Get default argument instead
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2586 oarg = defaultArg(loc, sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2587 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2588 { assert(i < dedtypes->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2589 // It might have already been deduced
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2590 oarg = (Object *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2591 if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2592 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2593 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2594 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2595
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2596 ei = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2597 Type *vt;
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 (!ei && oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2600 goto Lnomatch;
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 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2603 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2604 if (!ei || ei == edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2605 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2606
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2607 Expression *e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2608
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2609 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2610 e = e->implicitCastTo(sc, valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2611 e = e->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2612
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2613 ei = ei->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2614 ei = ei->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2615 ei = ei->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2616 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2617 //printf("e : %s, %s\n", e->toChars(), e->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2618 if (!ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2619 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2620 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2621 else if (dedtypes->data[i])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2622 { // Must match already deduced value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2623 Expression *e = (Expression *)dedtypes->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2624
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2625 if (!ei || !ei->equals(e))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2626 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2627 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2628 Lmatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2629 //printf("valType: %s, ty = %d\n", valType->toChars(), valType->ty);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2630 vt = valType->semantic(0, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2631 //printf("ei: %s, %s\n", ei->toChars(), ei->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2632 if (ei->type)
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 m = (MATCH)ei->implicitConvTo(vt);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2635 //printf("m: %d\n", m);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2636 if (!m)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2637 goto Lnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2638 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2639 dedtypes->data[i] = ei;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2640
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2641 init = new ExpInitializer(loc, ei);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2642 sparam = new VarDeclaration(loc, vt, ident, init);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2643 sparam->storage_class = STCconst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2644 *psparam = sparam;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2645 return m;
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 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2648 //printf("\tno match\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2649 *psparam = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2650 return MATCHnomatch;
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
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 void TemplateValueParameter::print(Object *oarg, Object *oded)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2655 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2656 printf(" %s\n", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2657
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2658 Expression *ea = isExpression(oded);
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 (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2661 printf("\tSpecialization: %s\n", specValue->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2662 printf("\tArgument Value: %s\n", ea ? ea->toChars() : "NULL");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2663 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2664
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2665
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2666 void TemplateValueParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2667 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2668 valType->toCBuffer(buf, ident, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2669 if (specValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2670 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2671 buf->writestring(" : ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2672 specValue->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2673 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2674 if (defaultValue)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2675 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2676 buf->writestring(" = ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2677 defaultValue->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2678 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2679 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2680
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2681
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2682 void *TemplateValueParameter::dummyArg()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2683 { Expression *e;
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 e = specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2686 if (!e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2687 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2688 // Create a dummy value
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2689 if (!edummy)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2690 edummy = valType->defaultInit();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2691 e = edummy;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2692 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2693 return (void *)e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2694 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2695
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2696
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2697 Object *TemplateValueParameter::specialization()
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 return specValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2700 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2701
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2702
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2703 Object *TemplateValueParameter::defaultArg(Loc loc, Scope *sc)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2704 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2705 Expression *e = defaultValue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2706 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2707 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2708 e = e->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2709 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2710 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2711 if (e->op == TOKdefault)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2712 { DefaultInitExp *de = (DefaultInitExp *)e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2713 e = de->resolve(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2714 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2715 #endif
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 return e;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2720 /* ======================== TemplateTupleParameter ========================== */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2721
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2722 // variadic-parameter
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2723
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2724 TemplateTupleParameter::TemplateTupleParameter(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2725 : TemplateParameter(loc, ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2726 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2727 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2728 }
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 TemplateTupleParameter *TemplateTupleParameter::isTemplateTupleParameter()
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 return this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2735 TemplateParameter *TemplateTupleParameter::syntaxCopy()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2736 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2737 TemplateTupleParameter *tp = new TemplateTupleParameter(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2738 return tp;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2739 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2740
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2741 void TemplateTupleParameter::declareParameter(Scope *sc)
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 TypeIdentifier *ti = new TypeIdentifier(loc, ident);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2744 sparam = new AliasDeclaration(loc, ident, ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2745 if (!sc->insert(sparam))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2746 error(loc, "parameter '%s' multiply defined", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2747 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2748
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2749 void TemplateTupleParameter::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2750 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2751 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2752
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2753 int TemplateTupleParameter::overloadMatch(TemplateParameter *tp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2754 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2755 TemplateTupleParameter *tvp = tp->isTemplateTupleParameter();
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 if (tvp)
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 return 1; // match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2760 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2761
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2762 Lnomatch:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2763 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2764 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2765
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2766 MATCH TemplateTupleParameter::matchArg(Scope *sc,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2767 Objects *tiargs, int i, TemplateParameters *parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2768 Objects *dedtypes,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2769 Declaration **psparam)
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 //printf("TemplateTupleParameter::matchArg()\n");
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 /* The rest of the actual arguments (tiargs[]) form the match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2774 * for the variadic parameter.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2775 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2776 assert(i + 1 == dedtypes->dim); // must be the last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2777 Tuple *ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2778 if (i + 1 == tiargs->dim && isTuple((Object *)tiargs->data[i]))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2779 ovar = isTuple((Object *)tiargs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2780 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2781 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2782 ovar = new Tuple();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2783 //printf("ovar = %p\n", ovar);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2784 if (i < tiargs->dim)
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 //printf("i = %d, tiargs->dim = %d\n", i, tiargs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2787 ovar->objects.setDim(tiargs->dim - i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2788 for (size_t j = 0; j < ovar->objects.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2789 ovar->objects.data[j] = tiargs->data[i + j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2790 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2791 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2792 *psparam = new TupleDeclaration(loc, ident, &ovar->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2793 dedtypes->data[i] = (void *)ovar;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2794 return MATCHexact;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2795 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2796
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 void TemplateTupleParameter::print(Object *oarg, Object *oded)
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 printf(" %s... [", ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2801 Tuple *v = isTuple(oded);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2802 assert(v);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2803
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2804 //printf("|%d| ", v->objects.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2805 for (int i = 0; i < v->objects.dim; i++)
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 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2808 printf(", ");
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 Object *o = (Object *)v->objects.data[i];
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 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2813 if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2814 printf("alias: %s", sa->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2815
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2816 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2817 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2818 printf("type: %s", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2819
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2820 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2821 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2822 printf("exp: %s", ea->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2823
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2824 assert(!isTuple(o)); // no nested Tuple arguments
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 printf("]\n");
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 void TemplateTupleParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2831 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2832 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2833 buf->writestring("...");
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
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 void *TemplateTupleParameter::dummyArg()
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 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2840 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2841
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 Object *TemplateTupleParameter::specialization()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2844 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2845 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2846 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2847
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2848
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2849 Object *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc)
336
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 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2852 }
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 /* ======================== TemplateInstance ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2855
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2856 TemplateInstance::TemplateInstance(Loc loc, Identifier *ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2857 : ScopeDsymbol(NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2858 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2859 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2860 printf("TemplateInstance(this = %p, ident = '%s')\n", this, ident ? ident->toChars() : "null");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2861 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2862 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2863 this->name = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2864 this->tiargs = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2865 this->tempdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2866 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2867 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2868 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2869 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2870 this->semantictiargsdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2871 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2872 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2873 this->havetempdecl = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2874 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2875 this->errors = 0;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2876
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2877 // LDC
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2878 this->tinst = NULL;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2879 this->tmodule = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2880 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2881
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2882 /*****************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2883 * 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
2884 * template to instantiate.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
2885 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2886
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2887 TemplateInstance::TemplateInstance(Loc loc, TemplateDeclaration *td, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2888 : ScopeDsymbol(NULL)
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2891 printf("TemplateInstance(this = %p, tempdecl = '%s')\n", this, td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2892 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2893 this->loc = loc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2894 this->name = td->ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2895 this->tiargs = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2896 this->tempdecl = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2897 this->inst = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2898 this->argsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2899 this->aliasdecl = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2900 this->semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2901 this->semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2902 this->withsym = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2903 this->nest = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2904 this->havetempdecl = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2905 this->isnested = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2906 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
2907
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
2908 // LDC
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2909 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
2910 this->tmodule = NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2911
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2912 assert((size_t)tempdecl->scope > 0x10000);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2916 Objects *TemplateInstance::arraySyntaxCopy(Objects *objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2917 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2918 Objects *a = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2919 if (objs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2920 { a = new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2921 a->setDim(objs->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2922 for (size_t i = 0; i < objs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2923 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2924 Type *ta = isType((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2925 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2926 a->data[i] = ta->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2927 else
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 Expression *ea = isExpression((Object *)objs->data[i]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2930 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2931 a->data[i] = ea->syntaxCopy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2932 }
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2935 return a;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2938 Dsymbol *TemplateInstance::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2939 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2940 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2941
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2942 if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2943 ti = (TemplateInstance *)s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2944 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2945 ti = new TemplateInstance(loc, name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2946
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2947 ti->tiargs = arraySyntaxCopy(tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2948
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2949 ScopeDsymbol::syntaxCopy(ti);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2950 return ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2951 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2952
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2953
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2954 void TemplateInstance::semantic(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2955 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2956 if (global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2957 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2958 if (!global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2959 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2960 /* Trying to soldier on rarely generates useful messages
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2961 * at this point.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2962 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2963 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2964 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2965 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2966 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2967 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2968 printf("\n+TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2969 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2970 if (inst) // if semantic() was already run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2971 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2972 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2973 printf("-TemplateInstance::semantic('%s', this=%p) already run\n", inst->toChars(), inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2974 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2975 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2976 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2977
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2978 if (semanticdone != 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2979 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2980 error(loc, "recursive template expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2981 // inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2982 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2983 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2984 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2985
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
2986 // 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
2987 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
2988
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
2989 // 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
2990 if (tinst)
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
2991 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
2992 else
1714836f2c0b Mostly rewrite debug info generation in terms of llvm/Analysis/DebugInfo.h.
Christian Kamm <kamm incasoftware de>
parents: 940
diff changeset
2993 tmodule = sc->module;
948
780530d1cad3 Revert templates to old behavior.
Christian Kamm <kamm incasoftware de>
parents: 946
diff changeset
2994 //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
2995
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2996 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2997 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2998 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2999 if (havetempdecl)
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 assert((size_t)tempdecl->scope > 0x10000);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3002 // Deduce tdtypes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3003 tdtypes.setDim(tempdecl->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3004 if (!tempdecl->matchWithInstance(this, &tdtypes, 0))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3005 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3006 error("incompatible arguments for template instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3007 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3008 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3009 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3010 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3011 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3012 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3013 /* 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
3014 * (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
3015 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3016 semanticTiargs(sc);
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 tempdecl = findTemplateDeclaration(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3019 if (tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3020 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3021 if (!tempdecl || global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3022 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3023 //printf("error return %p, %d\n", tempdecl, global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3024 return; // error recovery
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3025 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3026 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3027
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3028 isNested(tiargs);
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 /* See if there is an existing TemplateInstantiation that already
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3031 * implements the typeargs. If so, just refer to that one instead.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3032 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3033
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3034 for (size_t i = 0; i < tempdecl->instances.dim; i++)
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 TemplateInstance *ti = (TemplateInstance *)tempdecl->instances.data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3037 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3038 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
3039 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3040 assert(tdtypes.dim == ti->tdtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3041
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3042 // Nesting must match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3043 if (isnested != ti->isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3044 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3045 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3046 if (isnested && sc->parent != ti->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3047 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3048 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3049 for (size_t j = 0; j < tdtypes.dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3050 { Object *o1 = (Object *)tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3051 Object *o2 = (Object *)ti->tdtypes.data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3052 if (!match(o1, o2, tempdecl, sc))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3053 goto L1;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3056 // It's a match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3057 inst = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3058 parent = ti->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3059 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3060 printf("\tit's a match with instance %p\n", inst);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3061 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3062 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3063
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3064 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3065 ;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3068 /* So, we need to implement 'this' instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3069 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3070 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3071 printf("\timplement template instance '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3072 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3073 unsigned errorsave = global.errors;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3074 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3075 int tempdecl_instance_idx = tempdecl->instances.dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3076 tempdecl->instances.push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3077 parent = tempdecl->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3078 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3079
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3080 ident = genIdent(); // need an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3081
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3082 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3083 if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3084 parent = isnested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3085 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3086 //printf("parent = '%s'\n", parent->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3087
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3088 // Add 'this' to the enclosing scope's members[] so the semantic routines
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3089 // will get called on the instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3090 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3091 int dosemantic3 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3092 { Array *a;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3093
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3094 Scope *scx = sc;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3095 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3096 for (scx = sc; scx; scx = scx->enclosing)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3097 if (scx->scopesym)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3098 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3099 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3100
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3101 //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
3102 if (scx && scx->scopesym &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3103 scx->scopesym->members && !scx->scopesym->isTemplateMixin() &&
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3104 /* The following test should really be if scx->module recursively
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3105 * imports itself. Because if it does, see bugzilla 2500.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3106 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3107 //scx->module == tempdecl->getModule()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3108 !scx->module->imports(scx->module)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3109 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3110 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3111 //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
3112 a = scx->scopesym->members;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3113 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3114 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3115 { Module *m = sc->module->importedFrom;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3116 //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
3117 a = m->members;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3118 if (m->semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3119 dosemantic3 = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3120 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3121 for (int i = 0; 1; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3122 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3123 if (i == a->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 a->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3126 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3127 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3128 if (this == (Dsymbol *)a->data[i]) // if already in Array
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3129 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3130 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3131 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3132 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3133
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3134 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3135 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3136
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3137 // Create our own scope for the template parameters
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3138 Scope *scope = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3139 if (!scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3140 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3141 error("forward reference to template declaration %s\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3142 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3143 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3144
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3145 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3146 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3147 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3148 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3149 argsym->parent = scope->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3150 scope = scope->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3151
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3152 // Declare each template parameter as an alias for the argument type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3153 declareParameters(scope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3154
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3155 // Add members of template instance to template instance symbol table
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3156 // parent = scope->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3157 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3158 int memnum = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3159 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3160 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3161 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3162 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3163 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
3164 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3165 memnum |= s->addMember(scope, this, memnum);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3166 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3167 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3168 printf("adding members done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3169 #endif
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 /* See if there is only one member of template instance, and that
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3172 * member has the same name as the template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3173 * If so, this template instance becomes an alias for that member.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3174 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3175 //printf("members->dim = %d\n", members->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3176 if (members->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3177 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3178 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3179 if (Dsymbol::oneMembers(members, &s) && s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3180 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3181 //printf("s->kind = '%s'\n", s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3182 //s->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3183 //printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3184 if (s->ident && s->ident->equals(tempdecl->ident))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3185 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3186 //printf("setting aliasdecl\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3187 aliasdecl = new AliasDeclaration(loc, s->ident, s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3188 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3189 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3190 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3191
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3192 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3193 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3194 printf("\tdo semantic() on template instance members '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3195 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3196 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3197 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3198 //printf("isnested = %d, sc->parent = %s\n", isnested, sc->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3199 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
3200 sc2->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3201
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3202 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3203 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3204 __try
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3205 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3206 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3207 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3208 for (int i = 0; i < members->dim; 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 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3211 //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
3212 //printf("test: isnested = %d, sc2->parent = %s\n", isnested, sc2->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3213 // if (isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3214 // s->parent = sc->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3215 //printf("test3: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3216 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3217 //printf("test4: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3218 sc2->module->runDeferredSemantic();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3219 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3220 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3221 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3222 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3223 __except (__ehfilter(GetExceptionInformation()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3224 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3225 global.gag = 0; // ensure error message gets printed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3226 error("recursive expansion");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3227 fatal();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3228 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3229 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3230 #endif
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 any of the instantiation members didn't get semantic() run
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3233 * on them due to forward references, we cannot run semantic2()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3234 * or semantic3() yet.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3235 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3236 for (size_t i = 0; i < Module::deferred.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3237 { Dsymbol *sd = (Dsymbol *)Module::deferred.data[i];
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 if (sd->parent == this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3240 goto Laftersemantic;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3241 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3242
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3243 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3244 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3245 * for initializers inside a function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3246 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3247 // if (sc->parent->isFuncDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3248
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3249 /* BUG 782: this has problems if the classes this depends on
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3250 * are forward referenced. Find a way to defer semantic()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3251 * on this template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3252 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3253 semantic2(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3254
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3255 if (sc->func || dosemantic3)
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 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3258 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3259
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3260 Laftersemantic:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3261 sc2->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3262
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3263 scope->pop();
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 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3266 if (global.errors != errorsave)
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 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
3269 if(tinst)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3270 tinst->printInstantiationTrace();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3271 errors = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3272 if (global.gag)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3273 tempdecl->instances.remove(tempdecl_instance_idx);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3274 }
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3277 printf("-TemplateInstance::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3278 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3279 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3280
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3281
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3282 void TemplateInstance::semanticTiargs(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3283 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3284 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3285 if (semantictiargsdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3286 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3287 semantictiargsdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3288 semanticTiargs(loc, sc, tiargs);
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 void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3292 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3293 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3294 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3295 if (!tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3296 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3297 for (size_t j = 0; j < tiargs->dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3298 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3299 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3300 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3301 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3302 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3303
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3304 //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
3305 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3306 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3307 //printf("type %s\n", ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3308 // It might really be an Expression or an Alias
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3309 ta->resolve(loc, sc, &ea, &ta, &sa);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3310 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3311 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3312 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3313 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3314 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3315 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3316 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3317 { tiargs->data[j] = sa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3318 TupleDeclaration *d = sa->toAlias()->isTupleDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3319 if (d)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3320 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3321 size_t dim = d->objects->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3322 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3323 tiargs->insert(j, d->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3324 j--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3325 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3326 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3327 else if (ta)
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 if (ta->ty == Ttuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3330 { // Expand tuple
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3331 TypeTuple *tt = (TypeTuple *)ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3332 size_t dim = tt->arguments->dim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3333 tiargs->remove(j);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3334 if (dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3335 { tiargs->reserve(dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3336 for (size_t i = 0; i < dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3337 { Argument *arg = (Argument *)tt->arguments->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3338 tiargs->insert(j + i, arg->type);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3339 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3340 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3341 j--;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3344 tiargs->data[j] = ta;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3345 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3346 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3347 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3348 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3349 tiargs->data[j] = Type::terror;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3350 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3351 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3352 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3353 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3354 if (!ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3355 { assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3356 ea = new IntegerExp(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3357 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3358 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3359 ea = ea->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3360 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3361 tiargs->data[j] = ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3362 if (ea->op == TOKtype)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3363 tiargs->data[j] = ea->type;
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 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3366 {
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3369 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3370 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3371 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3372 //printf("1: tiargs->data[%d] = %p\n", j, tiargs->data[j]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3373 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3374 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3375 printf("-TemplateInstance::semanticTiargs('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3376 for (size_t j = 0; j < tiargs->dim; j++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3377 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3378 Object *o = (Object *)tiargs->data[j];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3379 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3380 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3381 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3382 Tuple *va = isTuple(o);
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("\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
3385 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3386 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3387 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3388
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 * Find template declaration corresponding to template instance.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3391 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3392
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3393 TemplateDeclaration *TemplateInstance::findTemplateDeclaration(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3394 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3395 //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3396 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3397 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3398 /* Given:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3399 * foo!( ... )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3400 * figure out which TemplateDeclaration foo refers to.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3401 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3402 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3403 Dsymbol *scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3404 Identifier *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3405 int i;
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 id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3408 s = sc->search(loc, id, &scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3409 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3410 { error("identifier '%s' is not defined", id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3411 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3412 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3413 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3414 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
3415 if (s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3416 printf("s->parent = '%s'\n", s->parent->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3417 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3418 withsym = scopesym->isWithScopeSymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3419
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3420 /* We might have found an alias within a template when
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3421 * we really want the template.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3422 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3423 TemplateInstance *ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3424 if (s->parent &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3425 (ti = s->parent->isTemplateInstance()) != NULL)
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 if (
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3428 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3429 ti->toAlias()->ident == id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3430 &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3431 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3432 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3433 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3434 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3435 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3436 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3437 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3438 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3439 tempdecl = tempdecl->overroot; // then get the start
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3440 s = tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3441 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3442 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3443
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3444 s = s->toAlias();
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 /* It should be a TemplateDeclaration, not some other symbol
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 tempdecl = s->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3449 if (!tempdecl)
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 if (!s->parent && global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3452 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3453 if (!s->parent && s->getType())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3454 { Dsymbol *s2 = s->getType()->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3455 if (!s2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3456 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3457 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
3458 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3460 s = s2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3461 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3462 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3463 //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3464 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3465 //assert(s->parent);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3466 TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3467 if (ti &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3468 (ti->name == id ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3469 ti->toAlias()->ident == id)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3470 &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3471 ti->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3472 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3473 /* This is so that one can refer to the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3474 * template, even if it has the same name as a member
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3475 * of the template, if it has a !(arguments)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3476 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3477 tempdecl = ti->tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3478 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3479 tempdecl = tempdecl->overroot; // then get the start
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3480 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3481 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3482 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3483 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
3484 return NULL;
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 }
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3489 assert(tempdecl->isTemplateDeclaration());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3490 return tempdecl;
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::findBestMatch(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 /* Since there can be multiple TemplateDeclaration's with the same
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3496 * name, look for the best match.
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 TemplateDeclaration *td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3499 TemplateDeclaration *td_best = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3500 MATCH m_best = MATCHnomatch;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3501 Objects dedtypes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3502
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3503 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3504 printf("TemplateInstance::findBestMatch()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3505 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3506 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3507 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3508 MATCH m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3509
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3510 //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
3511
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3512 // If more arguments than parameters,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3513 // then this is no match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3514 if (td->parameters->dim < tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3515 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3516 if (!td->isVariadic())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3517 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3518 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3519
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3520 dedtypes.setDim(td->parameters->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3521 dedtypes.zero();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3522 if (!td->scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3523 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3524 error("forward reference to template declaration %s", td->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3525 return 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 m = td->matchWithInstance(this, &dedtypes, 0);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3528 //printf("matchWithInstance = %d\n", m);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3529 if (!m) // no match at all
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3530 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3531
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3532 if (m < m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3533 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3534 if (m > m_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3535 goto Ltd;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3536
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3537 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3538 // Disambiguate by picking the most specialized TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3539 int c1 = td->leastAsSpecialized(td_best);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3540 int c2 = td_best->leastAsSpecialized(td);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3541 //printf("c1 = %d, c2 = %d\n", c1, c2);
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 if (c1 > c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3544 goto Ltd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3545 else if (c1 < c2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3546 goto Ltd_best;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3547 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3548 goto Lambig;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3549 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3550
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3551 Lambig: // td_best and td are ambiguous
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3552 td_ambig = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3553 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3554
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3555 Ltd_best: // td_best is the best match so far
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3556 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3557 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3558
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3559 Ltd: // td is the new best match
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3560 td_ambig = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3561 td_best = td;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3562 m_best = m;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3563 tdtypes.setDim(dedtypes.dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3564 memcpy(tdtypes.data, dedtypes.data, tdtypes.dim * sizeof(void *));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3565 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3566 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3567
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3568 if (!td_best)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3569 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3570 error("%s does not match any template declaration", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3571 return NULL;
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 if (td_ambig)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3574 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3575 error("%s matches more than one template declaration, %s and %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3576 toChars(), td_best->toChars(), td_ambig->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3577 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3578
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3579 /* The best match is td_best
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 tempdecl = td_best;
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 #if 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3584 /* Cast any value arguments to be same type as value parameter
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 for (size_t i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3587 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3588 Expression *ea = isExpression(o); // value argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3589 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3590 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3591 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3592 if (tvp)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3593 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3594 assert(ea);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3595 ea = ea->castTo(tvp->valType);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3596 ea = ea->optimize(WANTvalue | WANTinterpret);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3597 tiargs->data[i] = (Object *)ea;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3598 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3599 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3600 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3601
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3602 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3603 printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3604 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3605 return tempdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3606 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3607
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3608
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 * Determines if a TemplateInstance will need a nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3611 * generation of the TemplateDeclaration.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3612 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3613
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3614 int TemplateInstance::isNested(Objects *args)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3615 { int nested = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3616 //printf("TemplateInstance::isNested('%s')\n", tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3617
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3618 /* A nested instance happens when an argument references a local
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3619 * symbol that is on the stack.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3620 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3621 for (size_t i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3622 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3623 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3624 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3625 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3626 if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3627 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3628 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3629 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3630 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3631 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3632 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3633 if (ea->op == TOKfunction)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3634 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3635 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3636 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3637 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3638 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3639 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3640 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3641 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3642 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3643 if (d && !d->isDataseg() &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3644 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3645 !(d->storage_class & STCmanifest) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3646 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3647 (!d->isFuncDeclaration() || d->isFuncDeclaration()->isNested()) &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3648 !isTemplateMixin())
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 // if module level template
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3651 if (tempdecl->toParent()->isModule())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3652 { Dsymbol *dparent = d->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3653 if (!isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3654 isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3655 else if (isnested != dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3656 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3657 /* Select the more deeply nested of the two.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3658 * Error if one is not nested inside the other.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3659 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3660 for (Dsymbol *p = isnested; p; p = p->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3661 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3662 if (p == dparent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3663 goto L1; // isnested is most nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3664 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3665 for (Dsymbol *p = dparent; p; p = p->parent)
336
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 if (p == isnested)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3668 { isnested = dparent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3669 goto L1; // dparent is most nested
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3670 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3671 }
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3672 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
3673 toChars(), isnested->toChars(), dparent->toChars());
336
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 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3676 //printf("\tnested inside %s\n", isnested->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3677 nested |= 1;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3680 error("cannot use local '%s' as template parameter", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3681 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3682 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3683 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3684 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3685 nested |= isNested(&va->objects);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3686 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3687 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3688 return nested;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3689 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3690
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3691 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3692 * This instance needs an identifier for name mangling purposes.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3693 * Create one by taking the template declaration name and adding
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3694 * the type signature for it.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3695 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3696
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3697 Identifier *TemplateInstance::genIdent()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3698 { OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3699 char *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3700 Objects *args;
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 //printf("TemplateInstance::genIdent('%s')\n", tempdecl->ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3703 id = tempdecl->ident->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3704 buf.printf("__T%"PRIuSIZE"%s", strlen(id), id);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3705 args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3706 for (int i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3707 { Object *o = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3708 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3709 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3710 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3711 Tuple *va = isTuple(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3712 //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
3713 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3714 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3715 buf.writeByte('T');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3716 if (ta->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3717 buf.writestring(ta->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3718 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3719 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3720 #ifdef DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3721 printf("ta = %d, %s\n", ta->ty, ta->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3722 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3723 assert(global.errors);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3724 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3725 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3726 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3727 { sinteger_t v;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3728 real_t r;
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 if (ea->op == TOKvar)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3731 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3732 sa = ((VarExp *)ea)->var;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3733 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3734 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3735 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3736 if (ea->op == TOKfunction)
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 sa = ((FuncExp *)ea)->fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3739 ea = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3740 goto Lsa;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3741 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3742 buf.writeByte('V');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3743 if (ea->op == TOKtuple)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3744 { ea->error("tuple is not a valid template value argument");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3745 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3746 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3747 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3748 /* Use deco that matches what it would be for a function parameter
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 buf.writestring(ea->type->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3751 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3752 // Use type of parameter, not type of argument
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3753 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3754 assert(tp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3755 TemplateValueParameter *tvp = tp->isTemplateValueParameter();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3756 assert(tvp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3757 buf.writestring(tvp->valType->deco);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3758 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3759 ea->toMangleBuffer(&buf);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3760 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3761 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3762 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3763 Lsa:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3764 buf.writeByte('S');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3765 Declaration *d = sa->isDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3766 if (d && !d->type->deco)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3767 error("forward reference of %s", d->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3768 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3769 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3770 char *p = sa->mangle();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3771 buf.printf("%"PRIuSIZE"%s", strlen(p), p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3772 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3773 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3774 else if (va)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3775 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3776 assert(i + 1 == args->dim); // must be last one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3777 args = &va->objects;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3778 i = -1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3779 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3780 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3781 assert(0);
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 buf.writeByte('Z');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3784 id = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3785 buf.data = NULL;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3786 //printf("\tgenIdent = %s\n", id);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3787 return new Identifier(id, TOKidentifier);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3788 }
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 * Declare parameters of template instance, initialize them with the
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3793 * template instance arguments.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3794 */
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 void TemplateInstance::declareParameters(Scope *scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3797 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3798 //printf("TemplateInstance::declareParameters()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3799 for (int i = 0; i < tdtypes.dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3800 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3801 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3802 //Object *o = (Object *)tiargs->data[i];
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
3803 Object *o = (Object *)tdtypes.data[i]; // initializer for tp
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3804
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3805 //printf("\ttdtypes[%d] = %p\n", i, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3806 tempdecl->declareParameter(scope, tp, o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3807 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3808 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3809
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3810
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3811 void TemplateInstance::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3812 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3813
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3814 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3815 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3816 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3817 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3818 printf("+TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3819 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3820 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3821 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3822 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3823 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3824 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3825 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
3826 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3827 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3828 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3829 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3830 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3831 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3832 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3833 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3834 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3835 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3836 sc->pop();
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3839 printf("-TemplateInstance::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3840 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3843 void TemplateInstance::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3844 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3845 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3846 printf("TemplateInstance::semantic3('%s'), semanticdone = %d\n", toChars(), semanticdone);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3847 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3848 //if (toChars()[0] == 'D') *(char*)0=0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3849 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3850 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3851 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3852 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3853 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3854 sc = tempdecl->scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3855 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3856 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
3857 sc->tinst = this;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3858 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3859 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3860 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3861 s->semantic3(sc);
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 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3864 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3865 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3866 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3867
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3868 void TemplateInstance::toObjFile(int multiobj)
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3871 printf("TemplateInstance::toObjFile('%s', this = %p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3872 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3873 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3874 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3875 if (multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3876 // Append to list of object files to be written later
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3877 //obj_append(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3878 assert(0 && "multiobj");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3879 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3880 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3881 for (int i = 0; i < members->dim; i++)
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 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3884 s->toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3885 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3886 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3887 }
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 void TemplateInstance::inlineScan()
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3893 printf("TemplateInstance::inlineScan('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3894 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3895 if (!errors && members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3896 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3897 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3898 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3899 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3900 s->inlineScan();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3901 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3902 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3903 }
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 void TemplateInstance::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3906 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3907 int i;
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 Identifier *id = name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3910 buf->writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3911 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3912 if (nest)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3913 buf->writestring("...");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3914 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3915 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3916 nest++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3917 Objects *args = tiargs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3918 for (i = 0; i < args->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3919 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3920 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3921 buf->writeByte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3922 Object *oarg = (Object *)args->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3923 ObjectToCBuffer(buf, hgs, oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3924 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3925 nest--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3926 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3927 buf->writeByte(')');
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3930
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3931 Dsymbol *TemplateInstance::toAlias()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3932 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3933 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3934 printf("TemplateInstance::toAlias()\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3935 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3936 if (!inst)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3937 { error("cannot resolve forward reference");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3938 return this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3939 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3940
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3941 if (inst != this)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3942 return inst->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3943
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3944 if (aliasdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3945 return aliasdecl->toAlias();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3946
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3947 return inst;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3948 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3949
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3950 AliasDeclaration *TemplateInstance::isAliasDeclaration()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3951 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3952 return aliasdecl;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3953 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3954
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3955 const char *TemplateInstance::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3956 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3957 return "template instance";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3958 }
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 int TemplateInstance::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3961 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3962 *ps = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3963 return TRUE;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3964 }
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 char *TemplateInstance::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3967 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3968 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3969 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3970 char *s;
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 toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3973 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3974 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3975 return s;
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
561
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3978 void TemplateInstance::printInstantiationTrace()
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3979 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3980 if(global.gag)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3981 return;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3982
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3983 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
3984
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3985 // determine instantiation depth
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3986 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
3987 TemplateInstance* cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3988 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
3989 ++n_instantiations;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3990
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3991 // 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
3992 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
3993 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3994 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3995 while(cur)
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3996 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3997 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
3998 cur = cur->tinst;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
3999 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4000 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4001 else
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4002 {
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4003 cur = this;
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4004 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
4005 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
4006 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
4007 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
4008 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
4009 {}
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4010 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
4011 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
4012 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4013 }
d4e95db0e62b Introducing template instantiation traces for static asserts and errors within templates.
Christian Kamm <kamm incasoftware de>
parents: 527
diff changeset
4014
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4015 /* ======================== TemplateMixin ================================ */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4016
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4017 TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, Type *tqual,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4018 Array *idents, Objects *tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4019 : TemplateInstance(loc, (Identifier *)idents->data[idents->dim - 1])
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4020 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4021 //printf("TemplateMixin(ident = '%s')\n", ident ? ident->toChars() : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4022 this->ident = ident;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4023 this->tqual = tqual;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4024 this->idents = idents;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4025 this->tiargs = tiargs ? tiargs : new Objects();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4026 this->scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4027 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4028
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4029 Dsymbol *TemplateMixin::syntaxCopy(Dsymbol *s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4030 { TemplateMixin *tm;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4031
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4032 Array *ids = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4033 ids->setDim(idents->dim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4034 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4035 { // Matches TypeQualified::syntaxCopyHelper()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4036 Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4037 if (id->dyncast() == DYNCAST_DSYMBOL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4038 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4039 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4040
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4041 ti = (TemplateInstance *)ti->syntaxCopy(NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4042 id = (Identifier *)ti;
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 ids->data[i] = id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4045 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4046
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4047 tm = new TemplateMixin(loc, ident,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4048 (Type *)(tqual ? tqual->syntaxCopy() : NULL),
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4049 ids, tiargs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4050 TemplateInstance::syntaxCopy(tm);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4051 return tm;
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 void TemplateMixin::semantic(Scope *sc)
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 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4057 printf("+TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4058 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4059 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4060 if (semanticdone &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4061 // This for when a class/struct contains mixin members, and
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4062 // is done over because of forward references
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4063 (!parent || !toParent()->isAggregateDeclaration()))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4064 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4065 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4066 printf("\tsemantic done\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4067 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4068 return;
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 if (!semanticdone)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4071 semanticdone = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4072 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4073 printf("\tdo semantic\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4074 #endif
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 #if !IN_LLVM
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4077 // dont know what this is
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4078 util_progress();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4079 #endif
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 Scope *scx = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4082 if (scope)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4083 { sc = scope;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4084 scx = scope; // save so we don't make redundant copies
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4085 scope = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4086 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4087
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4088 // Follow qualifications to find the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4089 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4090 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4091 int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4092 Identifier *id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4093
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4094 if (tqual)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4095 { s = tqual->toDsymbol(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4096 i = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4097 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4098 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4099 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4100 i = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4101 id = (Identifier *)idents->data[0];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4102 switch (id->dyncast())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4103 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4104 case DYNCAST_IDENTIFIER:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4105 s = sc->search(loc, id, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4106 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4107
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4108 case DYNCAST_DSYMBOL:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4109 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4110 TemplateInstance *ti = (TemplateInstance *)id;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4111 ti->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4112 s = ti;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4113 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4114 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4115 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4116 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4117 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4118 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4119
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4120 for (; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4121 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4122 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4123 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4124 id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4125 s = s->searchX(loc, sc, id);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4126 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4127 if (!s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4128 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4129 error("is not defined");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4130 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4131 return;
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 tempdecl = s->toAlias()->isTemplateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4134 if (!tempdecl)
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 error("%s isn't a template", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4137 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4138 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4139 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4140 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4141
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4142 // Look for forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4143 assert(tempdecl);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4144 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4145 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4146 if (!td->scope)
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 /* Cannot handle forward references if mixin is a struct member,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4149 * because addField must happen during struct's semantic, not
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4150 * during the mixin semantic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4151 * runDeferred will re-run mixin's semantic outside of the struct's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4152 * semantic.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4153 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4154 semanticdone = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4155 AggregateDeclaration *ad = toParent()->isAggregateDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4156 if (ad)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4157 ad->sizeok = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4158 else
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 // Forward reference
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4161 //printf("forward reference - deferring\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4162 scope = scx ? scx : new Scope(*sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4163 scope->setNoFree();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4164 scope->module->addDeferredSemantic(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4165 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4166 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4167 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4170 // Run semantic on each argument, place results in tiargs[]
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4171 semanticTiargs(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4173 tempdecl = findBestMatch(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4174 if (!tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4175 { inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4176 return; // error recovery
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4177 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4178
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4179 if (!ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4180 ident = genIdent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4181
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4182 inst = this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4183 parent = sc->parent;
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 /* Detect recursive mixin instantiations.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4186 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4187 for (Dsymbol *s = parent; s; s = s->parent)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4188 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4189 //printf("\ts = '%s'\n", s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4190 TemplateMixin *tm = s->isTemplateMixin();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4191 if (!tm || tempdecl != tm->tempdecl)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4192 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4193
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4194 /* Different argument list lengths happen with variadic args
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4195 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4196 if (tiargs->dim != tm->tiargs->dim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4197 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4198
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4199 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4200 { Object *o = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4201 Type *ta = isType(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4202 Expression *ea = isExpression(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4203 Dsymbol *sa = isDsymbol(o);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4204 Object *tmo = (Object *)tm->tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4205 if (ta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4206 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4207 Type *tmta = isType(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4208 if (!tmta)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4209 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4210 if (!ta->equals(tmta))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4211 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4212 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4213 else if (ea)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4214 { Expression *tme = isExpression(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4215 if (!tme || !ea->equals(tme))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4216 goto Lcontinue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4217 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4218 else if (sa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4219 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4220 Dsymbol *tmsa = isDsymbol(tmo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4221 if (sa != tmsa)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4222 goto Lcontinue;
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4225 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4226 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4227 error("recursive mixin instantiation");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4228 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4229
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4230 Lcontinue:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4231 continue;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4234 // Copy the syntax trees from the TemplateDeclaration
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4235 members = Dsymbol::arraySyntaxCopy(tempdecl->members);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4236 if (!members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4237 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4239 symtab = new DsymbolTable();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4240
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4241 for (Scope *sce = sc; 1; sce = sce->enclosing)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4242 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4243 ScopeDsymbol *sds = (ScopeDsymbol *)sce->scopesym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4244 if (sds)
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 sds->importScope(this, PROTpublic);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4247 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4248 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4251 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4252 printf("\tcreate scope for template parameters '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4253 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4254 Scope *scy = sc;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4255 scy = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4256 scy->parent = this;
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 argsym = new ScopeDsymbol();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4259 argsym->parent = scy->parent;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4260 Scope *scope = scy->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4261
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4262 unsigned errorsave = global.errors;
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 // Declare each template parameter as an alias for the argument type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4265 declareParameters(scope);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4266
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4267 // Add members to enclosing scope, as well as this scope
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4268 for (unsigned i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4269 { Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4270
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4271 s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4272 s->addMember(scope, this, i);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4273 //sc->insert(s);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4274 //printf("sc->parent = %p, sc->scopesym = %p\n", sc->parent, sc->scopesym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4275 //printf("s->parent = %s\n", s->parent->toChars());
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4278 // Do semantic() analysis on template instance members
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4279 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4280 printf("\tdo semantic() on template instance members '%s'\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4281 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4282 Scope *sc2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4283 sc2 = scope->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4284 sc2->offset = sc->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4285 for (int i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4286 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4287 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4288 s->semantic(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4289 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4290 sc->offset = sc2->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4291
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4292 /* The problem is when to parse the initializer for a variable.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4293 * Perhaps VarDeclaration::semantic() should do it like it does
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4294 * for initializers inside a function.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4295 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4296 // if (sc->parent->isFuncDeclaration())
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 semantic2(sc2);
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 (sc->func)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4301 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4302 semantic3(sc2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4303 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4304
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4305 // Give additional context info if error occurred during instantiation
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4306 if (global.errors != errorsave)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4307 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4308 error("error instantiating");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4309 }
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 sc2->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4312
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4313 scope->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4314
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4315 // if (!isAnonymous())
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 scy->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4318 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4319 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4320 printf("-TemplateMixin::semantic('%s', this=%p)\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4321 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4322 }
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 void TemplateMixin::semantic2(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4325 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4326
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4327 if (semanticdone >= 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4328 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4329 semanticdone = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4330 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4331 printf("+TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4332 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4333 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4334 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4335 assert(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4336 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4337 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4338 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4339 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4340 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4341 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4342 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4343 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4344 s->semantic2(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4345 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4346 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4347 sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4348 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4349 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4350 printf("-TemplateMixin::semantic2('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4351 #endif
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 void TemplateMixin::semantic3(Scope *sc)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4355 { int i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4356
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4357 if (semanticdone >= 3)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4358 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4359 semanticdone = 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4360 #if LOG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4361 printf("TemplateMixin::semantic3('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4362 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4363 if (members)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4364 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4365 sc = sc->push(argsym);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4366 sc = sc->push(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4367 for (i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4369 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4370 s->semantic3(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4371 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4372 sc = sc->pop();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4373 sc->pop();
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4376
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4377 void TemplateMixin::inlineScan()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4378 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4379 TemplateInstance::inlineScan();
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 const char *TemplateMixin::kind()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4383 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4384 return "mixin";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4385 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4386
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4387 int TemplateMixin::oneMember(Dsymbol **ps)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4388 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4389 return Dsymbol::oneMember(ps);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4392 int TemplateMixin::hasPointers()
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 //printf("TemplateMixin::hasPointers() %s\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4395 for (size_t i = 0; i < members->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4396 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4397 Dsymbol *s = (Dsymbol *)members->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4398 //printf(" s = %s %s\n", s->kind(), s->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4399 if (s->hasPointers())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4400 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4401 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4402 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4403 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4404 return 0;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4407 char *TemplateMixin::toChars()
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 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4410 HdrGenState hgs;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4411 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4412
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4413 TemplateInstance::toCBuffer(&buf, &hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4414 s = buf.toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4415 buf.data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4416 return s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4417 }
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 void TemplateMixin::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
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 buf->writestring("mixin ");
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 for (int i = 0; i < idents->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4424 { Identifier *id = (Identifier *)idents->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4425
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4426 if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4427 buf->writeByte('.');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4428 buf->writestring(id->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4429 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4430 buf->writestring("!(");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4431 if (tiargs)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4432 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4433 for (int i = 0; i < tiargs->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4434 { if (i)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4435 buf->writebyte(',');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4436 Object *oarg = (Object *)tiargs->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4437 Type *t = isType(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4438 Expression *e = isExpression(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4439 Dsymbol *s = isDsymbol(oarg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4440 if (t)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4441 t->toCBuffer(buf, NULL, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4442 else if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4443 e->toCBuffer(buf, hgs);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4444 else if (s)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4445 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4446 char *p = s->ident ? s->ident->toChars() : s->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4447 buf->writestring(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4448 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4449 else if (!oarg)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4450 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4451 buf->writestring("NULL");
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 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4454 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4455 assert(0);
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4459 buf->writebyte(')');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4460 if (ident)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4461 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4462 buf->writebyte(' ');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4463 buf->writestring(ident->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4464 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4465 buf->writebyte(';');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4466 buf->writenl();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4467 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4468
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4469
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4470 void TemplateMixin::toObjFile(int multiobj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4471 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4472 //printf("TemplateMixin::toObjFile('%s')\n", toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4473 TemplateInstance::toObjFile(multiobj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4474 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4475