Mercurial > projects > ldc
annotate dmd2/template.c @ 1598:20799faa301d
Merged the patch for dmd bugzilla #3620 by request of downs.
author | Robert Clipsham <robert@octarineparrot.com> |
---|---|
date | Sun, 20 Dec 2009 13:58:08 +0000 |
parents | e4f7b5d9c68a |
children |
rev | line source |
---|---|
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2 // Compiler implementation of the D programming language |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3 // Copyright (c) 1999-2009 by Digital Mars |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4 // All Rights Reserved |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
5 // written by Walter Bright |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
6 // http://www.digitalmars.com |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
7 // License for redistribution is by either the Artistic License |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
8 // in artistic.txt, or the GNU General Public License in gnu.txt. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
9 // See the included readme.txt for details. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
10 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
11 // Handle template implementation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
12 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
13 #include <stdio.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
14 #include <assert.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
15 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
16 #include "root.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
17 #include "rmem.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
18 #include "stringtable.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
19 #include "mars.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
20 #include "identifier.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
21 #include "mtype.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
22 #include "template.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
23 #include "init.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
24 #include "expression.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
25 #include "scope.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
26 #include "module.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
27 #include "aggregate.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
28 #include "declaration.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
29 #include "dsymbol.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
30 #include "hdrgen.h" |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
31 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
32 #if WINDOWS_SEH |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
33 #include <windows.h> |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
34 long __cdecl __ehfilter(LPEXCEPTION_POINTERS ep); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
35 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
36 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
37 #define LOG 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
38 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
39 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
40 * These functions substitute for dynamic_cast. dynamic_cast does not work |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
41 * on earlier versions of gcc. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
42 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
43 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
44 Expression *isExpression(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
45 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
46 //return dynamic_cast<Expression *>(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
47 if (!o || o->dyncast() != DYNCAST_EXPRESSION) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
48 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
49 return (Expression *)o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
50 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
51 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
52 Dsymbol *isDsymbol(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
53 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
54 //return dynamic_cast<Dsymbol *>(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
55 if (!o || o->dyncast() != DYNCAST_DSYMBOL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
56 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
57 return (Dsymbol *)o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
58 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
59 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
60 Type *isType(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
61 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
62 //return dynamic_cast<Type *>(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
63 if (!o || o->dyncast() != DYNCAST_TYPE) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
64 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
65 return (Type *)o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
66 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
67 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
68 Tuple *isTuple(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
69 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
70 //return dynamic_cast<Tuple *>(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
71 if (!o || o->dyncast() != DYNCAST_TUPLE) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
72 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
73 return (Tuple *)o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
74 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
75 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
76 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
77 /*********************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
78 * Try to get arg as a type. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
79 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
80 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
81 Type *getType(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
82 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
83 Type *t = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
84 if (!t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
85 { Expression *e = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
86 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
87 t = e->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
88 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
89 return t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
90 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
91 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
92 Dsymbol *getDsymbol(Object *oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
93 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
94 Dsymbol *sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
95 Expression *ea = isExpression(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
96 if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
97 { // Try to convert Expression to symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
98 if (ea->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
99 sa = ((VarExp *)ea)->var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
100 else if (ea->op == TOKfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
101 sa = ((FuncExp *)ea)->fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
102 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
103 sa = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
104 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
105 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
106 { // Try to convert Type to symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
107 Type *ta = isType(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
108 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
109 sa = ta->toDsymbol(NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
110 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
111 sa = isDsymbol(oarg); // if already a symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
112 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
113 return sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
114 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
115 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
116 /****************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
117 * If o1 matches o2, return 1. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
118 * Else, return 0. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
119 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
120 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
121 int match(Object *o1, Object *o2, TemplateDeclaration *tempdecl, Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
122 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
123 Type *t1 = isType(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
124 Type *t2 = isType(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
125 Expression *e1 = isExpression(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
126 Expression *e2 = isExpression(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
127 Dsymbol *s1 = isDsymbol(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
128 Dsymbol *s2 = isDsymbol(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
129 Tuple *v1 = isTuple(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
130 Tuple *v2 = isTuple(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
131 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
132 //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); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
133 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
134 /* A proper implementation of the various equals() overrides |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
135 * should make it possible to just do o1->equals(o2), but |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
136 * we'll do that another day. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
137 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
138 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
139 if (t1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
140 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
141 /* if t1 is an instance of ti, then give error |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
142 * about recursive expansions. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
143 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
144 Dsymbol *s = t1->toDsymbol(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
145 if (s && s->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
146 { TemplateInstance *ti1 = s->parent->isTemplateInstance(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
147 if (ti1 && ti1->tempdecl == tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
148 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
149 for (Scope *sc1 = sc; sc1; sc1 = sc1->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
150 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
151 if (sc1->scopesym == ti1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
152 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
153 error("recursive template expansion for template argument %s", t1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
154 return 1; // fake a match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
155 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
156 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
157 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
158 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
159 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
160 //printf("t1 = %s\n", t1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
161 //printf("t2 = %s\n", t2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
162 if (!t2 || !t1->equals(t2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
163 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
164 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
165 else if (e1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
166 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
167 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
168 if (e1 && e2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
169 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
170 printf("match %d\n", e1->equals(e2)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
171 e1->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
172 e2->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
173 e1->type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
174 e2->type->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
175 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
176 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
177 if (!e2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
178 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
179 if (!e1->equals(e2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
180 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
181 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
182 else if (s1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
183 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
184 //printf("%p %s, %p %s\n", s1, s1->toChars(), s2, s2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
185 if (!s2 || !s1->equals(s2) || s1->parent != s2->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
186 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
187 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
188 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
189 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
190 VarDeclaration *v1 = s1->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
191 VarDeclaration *v2 = s2->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
192 if (v1 && v2 && v1->storage_class & v2->storage_class & STCmanifest) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
193 { ExpInitializer *ei1 = v1->init->isExpInitializer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
194 ExpInitializer *ei2 = v2->init->isExpInitializer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
195 if (ei1 && ei2 && !ei1->exp->equals(ei2->exp)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
196 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
197 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
198 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
199 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
200 else if (v1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
201 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
202 if (!v2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
203 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
204 if (v1->objects.dim != v2->objects.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
205 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
206 for (size_t i = 0; i < v1->objects.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
207 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
208 if (!match((Object *)v1->objects.data[i], |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
209 (Object *)v2->objects.data[i], |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
210 tempdecl, sc)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
211 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
212 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
213 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
214 //printf("match\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
215 return 1; // match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
216 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
217 //printf("nomatch\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
218 return 0; // nomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
219 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
220 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
221 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
222 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
223 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
224 void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
225 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
226 //printf("ObjectToCBuffer()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
227 Type *t = isType(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
228 Expression *e = isExpression(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
229 Dsymbol *s = isDsymbol(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
230 Tuple *v = isTuple(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
231 if (t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
232 { //printf("\tt: %s ty = %d\n", t->toChars(), t->ty); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
233 t->toCBuffer(buf, NULL, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
234 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
235 else if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
236 e->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
237 else if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
238 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
239 char *p = s->ident ? s->ident->toChars() : s->toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
240 buf->writestring(p); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
241 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
242 else if (v) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
243 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
244 Objects *args = &v->objects; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
245 for (size_t i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
246 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
247 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
248 buf->writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
249 Object *o = (Object *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
250 ObjectToCBuffer(buf, hgs, o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
251 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
252 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
253 else if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
254 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
255 buf->writestring("NULL"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
256 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
257 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
258 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
259 #ifdef DEBUG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
260 printf("bad Object = %p\n", oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
261 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
262 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
263 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
264 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
265 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
266 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
267 Object *objectSyntaxCopy(Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
268 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
269 if (!o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
270 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
271 Type *t = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
272 if (t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
273 return t->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
274 Expression *e = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
275 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
276 return e->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
277 return o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
278 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
279 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
280 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
281 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
282 /* ======================== TemplateDeclaration ============================= */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
283 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
284 TemplateDeclaration::TemplateDeclaration(Loc loc, Identifier *id, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
285 TemplateParameters *parameters, Expression *constraint, Array *decldefs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
286 : ScopeDsymbol(id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
287 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
288 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
289 printf("TemplateDeclaration(this = %p, id = '%s')\n", this, id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
290 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
291 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
292 if (parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
293 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
294 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
295 //printf("\tparameter[%d] = %p\n", i, tp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
296 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
297 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
298 if (ttp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
299 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
300 printf("\tparameter[%d] = %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
301 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
302 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
303 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
304 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
305 this->parameters = parameters; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
306 this->origParameters = parameters; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
307 this->constraint = constraint; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
308 this->members = decldefs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
309 this->overnext = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
310 this->overroot = NULL; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
311 this->semanticRun = 0; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
312 this->onemember = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
313 this->literal = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
314 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
315 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
316 Dsymbol *TemplateDeclaration::syntaxCopy(Dsymbol *) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
317 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
318 //printf("TemplateDeclaration::syntaxCopy()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
319 TemplateDeclaration *td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
320 TemplateParameters *p; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
321 Array *d; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
322 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
323 p = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
324 if (parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
325 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
326 p = new TemplateParameters(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
327 p->setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
328 for (int i = 0; i < p->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
329 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
330 p->data[i] = (void *)tp->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
331 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
332 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
333 Expression *e = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
334 if (constraint) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
335 e = constraint->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
336 d = Dsymbol::arraySyntaxCopy(members); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
337 td = new TemplateDeclaration(loc, ident, p, e, d); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
338 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
339 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
340 td->intrinsicName = intrinsicName; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
341 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
342 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
343 return td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
344 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
345 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
346 void TemplateDeclaration::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
347 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
348 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
349 printf("TemplateDeclaration::semantic(this = %p, id = '%s')\n", this, ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
350 #endif |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
351 if (semanticRun) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
352 return; // semantic() already run |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
353 semanticRun = 1; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
354 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
355 if (sc->func) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
356 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
357 #if DMDV1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
358 error("cannot declare template at function scope %s", sc->func->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
359 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
360 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
361 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
362 if (/*global.params.useArrayBounds &&*/ sc->module) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
363 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
364 // Generate this function as it may be used |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
365 // when template is instantiated in other modules |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
366 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
367 // FIXME: LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
368 //sc->module->toModuleArray(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
369 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
370 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
371 if (/*global.params.useAssert &&*/ sc->module) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
372 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
373 // Generate this function as it may be used |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
374 // when template is instantiated in other modules |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
375 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
376 // FIXME: LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
377 //sc->module->toModuleAssert(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
378 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
379 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
380 /* Remember Scope for later instantiations, but make |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
381 * a copy since attributes can change. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
382 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
383 this->scope = new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
384 this->scope->setNoFree(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
385 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
386 // Set up scope for parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
387 ScopeDsymbol *paramsym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
388 paramsym->parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
389 Scope *paramscope = sc->push(paramsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
390 paramscope->parameterSpecialization = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
391 paramscope->stc = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
392 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
393 if (!parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
394 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
395 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
396 if (global.params.doDocComments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
397 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
398 origParameters = new TemplateParameters(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
399 origParameters->setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
400 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
401 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
402 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
403 origParameters->data[i] = (void *)tp->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
404 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
405 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
406 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
407 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
408 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
409 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
410 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
411 tp->declareParameter(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
412 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
413 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
414 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
415 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
416 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
417 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
418 tp->semantic(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
419 if (i + 1 != parameters->dim && tp->isTemplateTupleParameter()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
420 error("template tuple parameter must be last one"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
421 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
422 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
423 paramscope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
424 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
425 if (members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
426 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
427 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
428 if (Dsymbol::oneMembers(members, &s)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
429 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
430 if (s && s->ident && s->ident->equals(ident)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
431 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
432 onemember = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
433 s->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
434 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
436 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
437 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
438 /* BUG: should check: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
439 * o no virtual functions or non-static data members of classes |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
440 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
441 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
442 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
443 const char *TemplateDeclaration::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
444 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
445 return (onemember && onemember->isAggregateDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
446 ? onemember->kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
447 : (char *)"template"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
448 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
449 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
450 /********************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
451 * Overload existing TemplateDeclaration 'this' with the new one 's'. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
452 * Return !=0 if successful; i.e. no conflict. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
453 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
454 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
455 int TemplateDeclaration::overloadInsert(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
456 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
457 TemplateDeclaration **pf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
458 TemplateDeclaration *f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
459 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
460 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
461 printf("TemplateDeclaration::overloadInsert('%s')\n", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
462 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
463 f = s->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
464 if (!f) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
465 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
466 TemplateDeclaration *pthis = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
467 for (pf = &pthis; *pf; pf = &(*pf)->overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
468 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
469 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
470 // Conflict if TemplateParameter's match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
471 // Will get caught anyway later with TemplateInstance, but |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
472 // should check it now. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
473 TemplateDeclaration *f2 = *pf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
474 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
475 if (f->parameters->dim != f2->parameters->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
476 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
477 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
478 for (int i = 0; i < f->parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
479 { TemplateParameter *p1 = (TemplateParameter *)f->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
480 TemplateParameter *p2 = (TemplateParameter *)f2->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
481 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
482 if (!p1->overloadMatch(p2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
483 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
484 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
485 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
486 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
487 printf("\tfalse: conflict\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
488 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
489 return FALSE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
490 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
491 Lcontinue: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
492 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
493 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
494 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
495 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
496 f->overroot = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
497 *pf = f; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
498 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
499 printf("\ttrue: no conflict\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
500 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
501 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
502 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
503 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
504 /*************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
505 * Given that ti is an instance of this TemplateDeclaration, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
506 * deduce the types of the parameters to this, and store |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
507 * those deduced types in dedtypes[]. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
508 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
509 * flag 1: don't do semantic() because of dummy types |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
510 * 2: don't change types in matchArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
511 * Output: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
512 * dedtypes deduced arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
513 * Return match level. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
514 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
515 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
516 MATCH TemplateDeclaration::matchWithInstance(TemplateInstance *ti, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
517 Objects *dedtypes, int flag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
518 { MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
519 int dedtypes_dim = dedtypes->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
520 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
521 #define LOGM 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
522 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
523 printf("\n+TemplateDeclaration::matchWithInstance(this = %s, ti = %s, flag = %d)\n", toChars(), ti->toChars(), flag); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
524 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
525 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
526 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
527 printf("dedtypes->dim = %d, parameters->dim = %d\n", dedtypes_dim, parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
528 if (ti->tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
529 printf("ti->tiargs->dim = %d, [0] = %p\n", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
530 ti->tiargs->dim, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
531 ti->tiargs->data[0]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
532 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
533 dedtypes->zero(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
534 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
535 int parameters_dim = parameters->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
536 int variadic = isVariadic() != NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
537 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
538 // If more arguments than parameters, no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
539 if (ti->tiargs->dim > parameters_dim && !variadic) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
540 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
541 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
542 printf(" no match: more arguments than parameters\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
543 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
544 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
545 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
546 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
547 assert(dedtypes_dim == parameters_dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
548 assert(dedtypes_dim >= ti->tiargs->dim || variadic); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
549 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
550 // Set up scope for parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
551 assert((size_t)scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
552 ScopeDsymbol *paramsym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
553 paramsym->parent = scope->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
554 Scope *paramscope = scope->push(paramsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
555 paramscope->stc = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
556 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
557 // Attempt type deduction |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
558 m = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
559 for (int i = 0; i < dedtypes_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
560 { MATCH m2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
561 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
562 Declaration *sparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
563 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
564 //printf("\targument [%d]\n", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
565 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
566 //printf("\targument [%d] is %s\n", i, oarg ? oarg->toChars() : "null"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
567 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
568 if (ttp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
569 printf("\tparameter[%d] is %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
570 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
571 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
572 #if DMDV1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
573 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
574 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
575 m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam, (flag & 2) ? 1 : 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
576 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
577 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
578 //printf("\tm2 = %d\n", m2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
579 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
580 if (m2 == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
581 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
582 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
583 printf("\tmatchArg() for parameter %i failed\n", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
584 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
585 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
586 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
587 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
588 if (m2 < m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
589 m = m2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
590 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
591 if (!flag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
592 sparam->semantic(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
593 if (!paramscope->insert(sparam)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
594 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
596 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
597 if (!flag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
598 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
599 /* Any parameter left without a type gets the type of |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
600 * its corresponding arg |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
601 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
602 for (int i = 0; i < dedtypes_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
603 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
604 if (!dedtypes->data[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
605 { assert(i < ti->tiargs->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
606 dedtypes->data[i] = ti->tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
607 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
608 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
609 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
610 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
611 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
612 if (m && constraint && !(flag & 1)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
613 { /* Check to see if constraint is satisfied. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
614 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
615 Expression *e = constraint->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
616 paramscope->flags |= SCOPEstaticif; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
617 e = e->semantic(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
618 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
619 if (e->isBool(TRUE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
620 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
621 else if (e->isBool(FALSE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
622 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
623 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
624 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
625 e->error("constraint %s is not constant or does not evaluate to a bool", e->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
626 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
627 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
628 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
629 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
630 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
631 // Print out the results |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
632 printf("--------------------------\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
633 printf("template %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
634 printf("instance %s\n", ti->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
635 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
636 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
637 for (int i = 0; i < dedtypes_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
638 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
639 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
640 Object *oarg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
641 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
642 printf(" [%d]", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
643 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
644 if (i < ti->tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
645 oarg = (Object *)ti->tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
646 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
647 oarg = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
648 tp->print(oarg, (Object *)dedtypes->data[i]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
649 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
650 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
651 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
652 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
653 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
654 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
655 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
656 printf(" match = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
657 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
658 goto Lret; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
659 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
660 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
661 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
662 printf(" no match\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
663 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
664 m = MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
665 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
666 Lret: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
667 paramscope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
668 #if LOGM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
669 printf("-TemplateDeclaration::matchWithInstance(this = %p, ti = %p) = %d\n", this, ti, m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
670 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
671 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
672 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
673 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
674 /******************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
675 * Determine partial specialization order of 'this' vs td2. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
676 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
677 * match this is at least as specialized as td2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
678 * 0 td2 is more specialized than this |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
679 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
680 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
681 MATCH TemplateDeclaration::leastAsSpecialized(TemplateDeclaration *td2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
682 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
683 /* This works by taking the template parameters to this template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
684 * declaration and feeding them to td2 as if it were a template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
685 * instance. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
686 * If it works, then this template is at least as specialized |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
687 * as td2. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
688 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
689 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
690 TemplateInstance ti(0, ident); // create dummy template instance |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
691 Objects dedtypes; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
692 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
693 #define LOG_LEASTAS 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
694 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
695 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
696 printf("%s.leastAsSpecialized(%s)\n", toChars(), td2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
697 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
698 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
699 // Set type arguments to dummy template instance to be types |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
700 // generated from the parameters to this template declaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
701 ti.tiargs = new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
702 ti.tiargs->setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
703 for (int i = 0; i < ti.tiargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
704 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
705 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
706 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
707 void *p = tp->dummyArg(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
708 if (p) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
709 ti.tiargs->data[i] = p; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
710 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
711 ti.tiargs->setDim(i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
712 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
713 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
714 // Temporary Array to hold deduced types |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
715 //dedtypes.setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
716 dedtypes.setDim(td2->parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
717 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
718 // Attempt a type deduction |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
719 MATCH m = td2->matchWithInstance(&ti, &dedtypes, 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
720 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
721 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
722 /* A non-variadic template is more specialized than a |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
723 * variadic one. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
724 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
725 if (isVariadic() && !td2->isVariadic()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
726 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
727 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
728 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
729 printf(" matches %d, so is least as specialized\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
730 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
731 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
732 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
733 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
734 #if LOG_LEASTAS |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
735 printf(" doesn't match, so is not as specialized\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
736 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
737 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
738 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
739 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
740 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
741 /************************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
742 * Match function arguments against a specific template function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
743 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
744 * loc instantiation location |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
745 * targsi Expression/Type initial list of template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
746 * ethis 'this' argument if !NULL |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
747 * fargs arguments to function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
748 * Output: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
749 * dedargs Expression/Type deduced template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
750 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
751 * match level |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
752 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
753 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
754 MATCH TemplateDeclaration::deduceFunctionTemplateMatch(Loc loc, Objects *targsi, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
755 Expression *ethis, Expressions *fargs, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
756 Objects *dedargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
757 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
758 size_t i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
759 size_t nfparams; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
760 size_t nfargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
761 size_t nargsi; // array size of targsi |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
762 int fptupindex = -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
763 int tuple_dim = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
764 MATCH match = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
765 FuncDeclaration *fd = onemember->toAlias()->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
766 Arguments *fparameters; // function parameter list |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
767 int fvarargs; // function varargs |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
768 Objects dedtypes; // for T:T*, the dedargs is the T*, dedtypes is the T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
769 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
770 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
771 printf("\nTemplateDeclaration::deduceFunctionTemplateMatch() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
772 for (i = 0; i < fargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
773 { Expression *e = (Expression *)fargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
774 printf("\tfarg[%d] is %s, type is %s\n", i, e->toChars(), e->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
775 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
776 printf("fd = %s\n", fd->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
777 printf("fd->type = %p\n", fd->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
778 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
779 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
780 assert((size_t)scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
781 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
782 dedargs->setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
783 dedargs->zero(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
784 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
785 dedtypes.setDim(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
786 dedtypes.zero(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
787 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
788 // Set up scope for parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
789 ScopeDsymbol *paramsym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
790 paramsym->parent = scope->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
791 Scope *paramscope = scope->push(paramsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
792 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
793 TemplateTupleParameter *tp = isVariadic(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
794 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
795 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
796 for (i = 0; i < dedargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
797 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
798 printf("\tdedarg[%d] = ", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
799 Object *oarg = (Object *)dedargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
800 if (oarg) printf("%s", oarg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
801 printf("\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
802 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
803 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
804 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
805 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
806 nargsi = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
807 if (targsi) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
808 { // Set initial template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
809 size_t n; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
810 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
811 nargsi = targsi->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
812 n = parameters->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
813 if (tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
814 n--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
815 if (nargsi > n) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
816 { if (!tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
817 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
818 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
819 /* The extra initial template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
820 * now form the tuple argument. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
821 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
822 Tuple *t = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
823 assert(parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
824 dedargs->data[parameters->dim - 1] = (void *)t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
826 tuple_dim = nargsi - n; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
827 t->objects.setDim(tuple_dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
828 for (size_t i = 0; i < tuple_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
829 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
830 t->objects.data[i] = (void *)targsi->data[n + i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
831 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
832 declareParameter(paramscope, tp, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
833 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
834 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
835 n = nargsi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
836 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
837 memcpy(dedargs->data, targsi->data, n * sizeof(*dedargs->data)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
838 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
839 for (size_t i = 0; i < n; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
840 { assert(i < parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
841 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
842 MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
843 Declaration *sparam = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
844 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
845 m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
846 //printf("\tdeduceType m = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
847 if (m == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
848 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
849 if (m < match) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
850 match = m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
851 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
852 sparam->semantic(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
853 if (!paramscope->insert(sparam)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
854 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
855 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
856 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
857 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
858 for (i = 0; i < dedargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
859 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
860 printf("\tdedarg[%d] = ", i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
861 Object *oarg = (Object *)dedargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
862 if (oarg) printf("%s", oarg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
863 printf("\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
864 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
865 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
866 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
867 if (fd->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
868 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
869 assert(fd->type->ty == Tfunction); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
870 TypeFunction *fdtype = (TypeFunction *)fd->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
871 fparameters = fdtype->parameters; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
872 fvarargs = fdtype->varargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
873 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
874 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
875 { CtorDeclaration *fctor = fd->isCtorDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
876 assert(fctor); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
877 fparameters = fctor->arguments; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
878 fvarargs = fctor->varargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
879 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
880 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
881 nfparams = Argument::dim(fparameters); // number of function parameters |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
882 nfargs = fargs ? fargs->dim : 0; // number of function arguments |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
883 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
884 /* Check for match of function arguments with variadic template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
885 * parameter, such as: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
886 * |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
887 * template Foo(T, A...) { void Foo(T t, A a); } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
888 * void main() { Foo(1,2,3); } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
889 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
890 if (tp) // if variadic |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
891 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
892 if (nfparams == 0) // if no function parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
893 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
894 Tuple *t = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
895 //printf("t = %p\n", t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
896 dedargs->data[parameters->dim - 1] = (void *)t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
897 declareParameter(paramscope, tp, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
898 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
899 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
900 else if (nfargs < nfparams - 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
901 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
902 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
903 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
904 /* Figure out which of the function parameters matches |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
905 * the tuple template parameter. Do this by matching |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
906 * type identifiers. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
907 * Set the index of this function parameter to fptupindex. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
908 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
909 for (fptupindex = 0; fptupindex < nfparams; fptupindex++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
910 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
911 Argument *fparam = (Argument *)fparameters->data[fptupindex]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
912 if (fparam->type->ty != Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
913 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
914 TypeIdentifier *tid = (TypeIdentifier *)fparam->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
915 if (!tp->ident->equals(tid->ident) || tid->idents.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
916 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
917 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
918 if (fvarargs) // variadic function doesn't |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
919 goto Lnomatch; // go with variadic template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
920 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
921 /* The types of the function arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
922 * now form the tuple argument. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
923 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
924 Tuple *t = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
925 dedargs->data[parameters->dim - 1] = (void *)t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
926 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
927 tuple_dim = nfargs - (nfparams - 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
928 t->objects.setDim(tuple_dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
929 for (i = 0; i < tuple_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
930 { Expression *farg = (Expression *)fargs->data[fptupindex + i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
931 t->objects.data[i] = (void *)farg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
932 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
933 declareParameter(paramscope, tp, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
934 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
935 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
936 fptupindex = -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
937 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
938 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
939 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
940 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
941 if (nfparams == nfargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
942 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
943 else if (nfargs > nfparams) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
944 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
945 if (fvarargs == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
946 goto Lnomatch; // too many args, no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
947 match = MATCHconvert; // match ... with a conversion |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
948 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
949 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
950 L2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
951 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
952 // Match 'ethis' to any TemplateThisParameter's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
953 if (ethis) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
954 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
955 for (size_t i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
956 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
957 TemplateThisParameter *ttp = tp->isTemplateThisParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
958 if (ttp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
959 { MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
960 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
961 Type *t = new TypeIdentifier(0, ttp->ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
962 m = ethis->type->deduceType(paramscope, t, parameters, &dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
963 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
964 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
965 if (m < match) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
966 match = m; // pick worst match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
967 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
968 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
969 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
970 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
971 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
972 // Loop through the function parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
973 for (i = 0; i < nfparams; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
974 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
975 /* Skip over function parameters which wound up |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
976 * as part of a template tuple parameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
977 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
978 if (i == fptupindex) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
979 { if (fptupindex == nfparams - 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
980 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
981 i += tuple_dim - 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
982 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
983 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
984 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
985 Argument *fparam = Argument::getNth(fparameters, i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
986 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
987 if (i >= nfargs) // if not enough arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
988 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
989 if (fparam->defaultArg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
990 { /* Default arguments do not participate in template argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
991 * deduction. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
992 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
993 goto Lmatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
994 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
995 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
996 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
997 { Expression *farg = (Expression *)fargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
998 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
999 printf("\tfarg->type = %s\n", farg->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1000 printf("\tfparam->type = %s\n", fparam->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1001 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1002 Type *argtype = farg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1003 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1004 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1005 /* Allow string literals which are type [] to match with [dim] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1006 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1007 if (farg->op == TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1008 { StringExp *se = (StringExp *)farg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1009 if (!se->committed && argtype->ty == Tarray && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1010 fparam->type->toBasetype()->ty == Tsarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1011 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1012 argtype = new TypeSArray(argtype->nextOf(), new IntegerExp(se->loc, se->len, Type::tindex)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1013 argtype = argtype->semantic(se->loc, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1014 argtype = argtype->invariantOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1015 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1016 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1017 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1018 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1019 MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1020 m = argtype->deduceType(paramscope, fparam->type, parameters, &dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1021 //printf("\tdeduceType m = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1022 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1023 /* If no match, see if there's a conversion to a delegate |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1024 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1025 if (!m && fparam->type->toBasetype()->ty == Tdelegate) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1026 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1027 TypeDelegate *td = (TypeDelegate *)fparam->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1028 TypeFunction *tf = (TypeFunction *)td->next; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1029 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1030 if (!tf->varargs && Argument::dim(tf->parameters) == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1031 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1032 m = farg->type->deduceType(paramscope, tf->next, parameters, &dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1033 if (!m && tf->next->toBasetype()->ty == Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1034 m = MATCHconvert; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1035 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1036 //printf("\tm2 = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1037 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1038 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1039 if (m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1040 { if (m < match) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1041 match = m; // pick worst match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1042 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1043 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1044 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1045 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1046 /* The following code for variadic arguments closely |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1047 * matches TypeFunction::callMatch() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1048 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1049 if (!(fvarargs == 2 && i + 1 == nfparams)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1050 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1051 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1052 /* Check for match with function parameter T... |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1053 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1054 Type *tb = fparam->type->toBasetype(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1055 switch (tb->ty) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1056 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1057 // Perhaps we can do better with this, see TypeFunction::callMatch() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1058 case Tsarray: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1059 { TypeSArray *tsa = (TypeSArray *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1060 dinteger_t sz = tsa->dim->toInteger(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1061 if (sz != nfargs - i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1062 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1063 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1064 case Tarray: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1065 { TypeArray *ta = (TypeArray *)tb; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1066 for (; i < nfargs; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1067 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1068 Expression *arg = (Expression *)fargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1069 assert(arg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1070 MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1071 /* If lazy array of delegates, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1072 * convert arg(s) to delegate(s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1073 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1074 Type *tret = fparam->isLazyArray(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1075 if (tret) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1076 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1077 if (ta->next->equals(arg->type)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1078 { m = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1079 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1080 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1081 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1082 m = arg->implicitConvTo(tret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1083 if (m == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1084 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1085 if (tret->toBasetype()->ty == Tvoid) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1086 m = MATCHconvert; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1087 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1088 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1089 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1090 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1091 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1092 m = arg->type->deduceType(paramscope, ta->next, parameters, &dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1093 //m = arg->implicitConvTo(ta->next); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1094 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1095 if (m == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1096 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1097 if (m < match) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1098 match = m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1099 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1100 goto Lmatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1101 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1102 case Tclass: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1103 case Tident: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1104 goto Lmatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1105 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1106 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1107 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1108 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1109 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1110 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1111 Lmatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1112 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1113 /* Fill in any missing arguments with their defaults. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1114 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1115 for (i = nargsi; i < dedargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1116 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1117 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1118 //printf("tp[%d] = %s\n", i, tp->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1119 /* For T:T*, the dedargs is the T*, dedtypes is the T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1120 * But for function templates, we really need them to match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1121 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1122 Object *oarg = (Object *)dedargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1123 Object *oded = (Object *)dedtypes.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1124 //printf("1dedargs[%d] = %p, dedtypes[%d] = %p\n", i, oarg, i, oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1125 //if (oarg) printf("oarg: %s\n", oarg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1126 //if (oded) printf("oded: %s\n", oded->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1127 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1128 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1129 if (oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1130 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1131 if (tp->specialization()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1132 { /* The specialization can work as long as afterwards |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1133 * the oded == oarg |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1134 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1135 Declaration *sparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1136 dedargs->data[i] = (void *)oded; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1137 MATCH m2 = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1138 //printf("m2 = %d\n", m2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1139 if (!m2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1140 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1141 if (m2 < match) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1142 match = m2; // pick worst match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1143 if (dedtypes.data[i] != oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1144 error("specialization not allowed for deduced parameter %s", tp->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1145 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1146 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1147 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1148 { oded = tp->defaultArg(loc, paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1149 if (!oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1150 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1151 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1152 declareParameter(paramscope, tp, oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1153 dedargs->data[i] = (void *)oded; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1154 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1155 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1156 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1157 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1158 if (constraint) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1159 { /* Check to see if constraint is satisfied. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1160 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1161 Expression *e = constraint->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1162 paramscope->flags |= SCOPEstaticif; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1163 e = e->semantic(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1164 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1165 if (e->isBool(TRUE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1166 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1167 else if (e->isBool(FALSE)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1168 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1169 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1170 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1171 e->error("constraint %s is not constant or does not evaluate to a bool", e->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1172 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1173 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1174 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1175 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1176 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1177 for (i = 0; i < dedargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1178 { Type *t = (Type *)dedargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1179 printf("\tdedargs[%d] = %d, %s\n", i, t->dyncast(), t->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1180 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1181 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1182 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1183 paramscope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1184 //printf("\tmatch %d\n", match); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1185 return match; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1186 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1187 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1188 paramscope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1189 //printf("\tnomatch\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1190 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1191 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1192 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1193 /************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1194 * Declare template parameter tp with value o, and install it in the scope sc. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1195 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1196 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1197 void TemplateDeclaration::declareParameter(Scope *sc, TemplateParameter *tp, Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1198 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1199 //printf("TemplateDeclaration::declareParameter('%s', o = %p)\n", tp->ident->toChars(), o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1200 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1201 Type *targ = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1202 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1203 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1204 Tuple *va = isTuple(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1205 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1206 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1207 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1208 // See if tp->ident already exists with a matching definition |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1209 Dsymbol *scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1210 s = sc->search(loc, tp->ident, &scopesym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1211 if (s && scopesym == sc->scopesym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1212 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1213 TupleDeclaration *td = s->isTupleDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1214 if (va && td) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1215 { Tuple tup; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1216 tup.objects = *td->objects; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1217 if (match(va, &tup, this, sc)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1218 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1219 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1220 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1221 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1222 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1223 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1224 if (targ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1225 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1226 //printf("type %s\n", targ->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1227 s = new AliasDeclaration(0, tp->ident, targ); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1228 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1229 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1230 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1231 //printf("Alias %s %s;\n", sa->ident->toChars(), tp->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1232 s = new AliasDeclaration(0, tp->ident, sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1233 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1234 else if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1235 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1236 // tdtypes.data[i] always matches ea here |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1237 Initializer *init = new ExpInitializer(loc, ea); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1238 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1239 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1240 Type *t = tvp ? tvp->valType : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1241 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1242 VarDeclaration *v = new VarDeclaration(loc, t, tp->ident, init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1243 v->storage_class = STCmanifest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1244 s = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1245 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1246 else if (va) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1247 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1248 //printf("\ttuple\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1249 s = new TupleDeclaration(loc, tp->ident, &va->objects); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1250 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1251 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1252 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1253 #ifdef DEBUG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1254 o->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1255 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1256 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1257 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1258 if (!sc->insert(s)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1259 error("declaration %s is already defined", tp->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1260 s->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1261 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1262 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1263 /************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1264 * Determine if TemplateDeclaration is variadic. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1265 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1266 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1267 TemplateTupleParameter *isVariadic(TemplateParameters *parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1268 { size_t dim = parameters->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1269 TemplateTupleParameter *tp = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1270 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1271 if (dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1272 tp = ((TemplateParameter *)parameters->data[dim - 1])->isTemplateTupleParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1273 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1274 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1275 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1276 TemplateTupleParameter *TemplateDeclaration::isVariadic() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1277 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1278 return ::isVariadic(parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1279 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1280 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1281 /*********************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1282 * We can overload templates. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1283 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1284 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1285 int TemplateDeclaration::isOverloadable() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1286 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1287 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1288 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1289 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1290 /************************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1291 * Given function arguments, figure out which template function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1292 * to expand, and return that function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1293 * If no match, give error message and return NULL. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1294 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1295 * sc instantiation scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1296 * loc instantiation location |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1297 * targsi initial list of template arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1298 * ethis if !NULL, the 'this' pointer argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1299 * fargs arguments to function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1300 * flags 1: do not issue error message on no match, just return NULL |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1301 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1302 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1303 FuncDeclaration *TemplateDeclaration::deduceFunctionTemplate(Scope *sc, Loc loc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1304 Objects *targsi, Expression *ethis, Expressions *fargs, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1305 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1306 MATCH m_best = MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1307 TemplateDeclaration *td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1308 TemplateDeclaration *td_best = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1309 Objects *tdargs = new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1310 TemplateInstance *ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1311 FuncDeclaration *fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1312 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1313 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1314 printf("TemplateDeclaration::deduceFunctionTemplate() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1315 printf(" targsi:\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1316 if (targsi) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1317 { for (int i = 0; i < targsi->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1318 { Object *arg = (Object *)targsi->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1319 printf("\t%s\n", arg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1320 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1321 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1322 printf(" fargs:\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1323 for (int i = 0; i < fargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1324 { Expression *arg = (Expression *)fargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1325 printf("\t%s %s\n", arg->type->toChars(), arg->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1326 //printf("\tty = %d\n", arg->type->ty); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1327 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1328 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1329 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1330 for (TemplateDeclaration *td = this; td; td = td->overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1331 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
1332 if (!td->semanticRun) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1333 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1334 error("forward reference to template %s", td->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1335 goto Lerror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1336 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1337 if (!td->onemember || !td->onemember->toAlias()->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1338 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1339 error("is not a function template"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1340 goto Lerror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1341 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1342 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1343 MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1344 Objects dedargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1345 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1346 m = td->deduceFunctionTemplateMatch(loc, targsi, ethis, fargs, &dedargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1347 //printf("deduceFunctionTemplateMatch = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1348 if (!m) // if no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1349 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1350 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1351 if (m < m_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1352 goto Ltd_best; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1353 if (m > m_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1354 goto Ltd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1355 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1356 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1357 // Disambiguate by picking the most specialized TemplateDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1358 MATCH c1 = td->leastAsSpecialized(td_best); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1359 MATCH c2 = td_best->leastAsSpecialized(td); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1360 //printf("c1 = %d, c2 = %d\n", c1, c2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1361 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1362 if (c1 > c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1363 goto Ltd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1364 else if (c1 < c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1365 goto Ltd_best; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1366 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1367 goto Lambig; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1368 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1369 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1370 Lambig: // td_best and td are ambiguous |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1371 td_ambig = td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1372 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1373 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1374 Ltd_best: // td_best is the best match so far |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1375 td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1376 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1377 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1378 Ltd: // td is the new best match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1379 td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1380 assert((size_t)td->scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1381 td_best = td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1382 m_best = m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1383 tdargs->setDim(dedargs.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1384 memcpy(tdargs->data, dedargs.data, tdargs->dim * sizeof(void *)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1385 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1386 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1387 if (!td_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1388 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1389 if (!(flags & 1)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1390 error(loc, "does not match any function template declaration"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1391 goto Lerror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1392 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1393 if (td_ambig) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1394 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1395 error(loc, "matches more than one function template declaration:\n %s\nand:\n %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1396 td_best->toChars(), td_ambig->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1397 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1398 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1399 /* The best match is td_best with arguments tdargs. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1400 * Now instantiate the template. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1401 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1402 assert((size_t)td_best->scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1403 ti = new TemplateInstance(loc, td_best, tdargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1404 ti->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1405 fd = ti->toAlias()->isFuncDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1406 if (!fd) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1407 goto Lerror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1408 return fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1409 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1410 Lerror: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1411 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1412 if (!(flags & 1)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1413 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1414 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1415 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1416 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1417 OutBuffer bufa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1418 Objects *args = targsi; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1419 if (args) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1420 { for (int i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1421 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1422 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1423 bufa.writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1424 Object *oarg = (Object *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1425 ObjectToCBuffer(&bufa, &hgs, oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1426 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1427 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1428 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1429 OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1430 argExpTypesToCBuffer(&buf, fargs, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1431 error(loc, "cannot deduce template function from argument types !(%s)(%s)", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1432 bufa.toChars(), buf.toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1433 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1434 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1435 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1436 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1437 void TemplateDeclaration::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1438 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1439 #if 0 // Should handle template functions |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1440 if (onemember && onemember->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1441 buf->writestring("foo "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1442 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1443 buf->writestring(kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1444 buf->writeByte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1445 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1446 buf->writeByte('('); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1447 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1448 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1449 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1450 if (hgs->ddoc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1451 tp = (TemplateParameter *)origParameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1452 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1453 buf->writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1454 tp->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1455 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1456 buf->writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1457 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1458 if (constraint) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1459 { buf->writestring(" if ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1460 constraint->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1461 buf->writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1462 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1463 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1464 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1465 if (hgs->hdrgen) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1466 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1467 hgs->tpltMember++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1468 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1469 buf->writebyte('{'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1470 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1471 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1472 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1473 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1474 s->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1475 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1476 buf->writebyte('}'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1477 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1478 hgs->tpltMember--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1479 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1480 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1481 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1482 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1483 char *TemplateDeclaration::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1484 { OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1485 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1486 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1487 memset(&hgs, 0, sizeof(hgs)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1488 buf.writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1489 buf.writeByte('('); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1490 for (int i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1491 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1492 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1493 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1494 buf.writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1495 tp->toCBuffer(&buf, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1496 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1497 buf.writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1498 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1499 if (constraint) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1500 { buf.writestring(" if ("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1501 constraint->toCBuffer(&buf, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1502 buf.writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1503 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1504 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1505 buf.writeByte(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1506 return (char *)buf.extractData(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1507 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1508 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1509 /* ======================== Type ============================================ */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1510 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1511 /**** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1512 * Given an identifier, figure out which TemplateParameter it is. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1513 * Return -1 if not found. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1514 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1515 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1516 int templateIdentifierLookup(Identifier *id, TemplateParameters *parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1517 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1518 for (size_t i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1519 { TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1520 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1521 if (tp->ident->equals(id)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1522 return i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1523 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1524 return -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1525 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1526 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1527 int templateParameterLookup(Type *tparam, TemplateParameters *parameters) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1528 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1529 assert(tparam->ty == Tident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1530 TypeIdentifier *tident = (TypeIdentifier *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1531 //printf("\ttident = '%s'\n", tident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1532 if (tident->idents.dim == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1533 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1534 return templateIdentifierLookup(tident->ident, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1535 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1536 return -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1537 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1538 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1539 /* These form the heart of template argument deduction. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1540 * Given 'this' being the type argument to the template instance, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1541 * it is matched against the template declaration parameter specialization |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1542 * 'tparam' to determine the type to be used for the parameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1543 * Example: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1544 * template Foo(T:T*) // template declaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1545 * Foo!(int*) // template instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1546 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1547 * this = int* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1548 * tparam = T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1549 * parameters = [ T:T* ] // Array of TemplateParameter's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1550 * Output: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1551 * dedtypes = [ int ] // Array of Expression/Type's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1552 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1553 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1554 MATCH Type::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1555 Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1556 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1557 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1558 printf("Type::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1559 printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1560 printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1561 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1562 if (!tparam) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1563 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1564 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1565 if (this == tparam) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1566 goto Lexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1567 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1568 if (tparam->ty == Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1569 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1570 // Determine which parameter tparam is |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1571 int i = templateParameterLookup(tparam, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1572 if (i == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1573 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1574 if (!sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1575 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1576 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1577 /* Need a loc to go with the semantic routine. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1578 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1579 Loc loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1580 if (parameters->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1581 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1582 TemplateParameter *tp = (TemplateParameter *)parameters->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1583 loc = tp->loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1584 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1585 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1586 /* BUG: what if tparam is a template instance, that |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1587 * has as an argument another Tident? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1588 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1589 tparam = tparam->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1590 assert(tparam->ty != Tident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1591 return deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1592 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1593 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1594 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1595 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1596 // Found the corresponding parameter tp |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1597 if (!tp->isTemplateTypeParameter()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1598 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1599 Type *tt = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1600 Type *at = (Type *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1601 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1602 // 3*3 == 9 cases |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1603 if (tparam->isMutable()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1604 { // foo(U:U) T => T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1605 // foo(U:U) const(T) => const(T) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1606 // foo(U:U) invariant(T) => invariant(T) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1607 if (!at) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1608 { dedtypes->data[i] = (void *)this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1609 goto Lexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1610 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1611 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1612 else if (mod == tparam->mod) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1613 { // foo(U:const(U)) const(T) => T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1614 // foo(U:invariant(U)) invariant(T) => T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1615 tt = mutableOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1616 if (!at) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1617 { dedtypes->data[i] = (void *)tt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1618 goto Lexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1619 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1620 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1621 else if (tparam->isConst()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1622 { // foo(U:const(U)) T => T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1623 // foo(U:const(U)) invariant(T) => T |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1624 tt = mutableOf(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1625 if (!at) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1626 { dedtypes->data[i] = (void *)tt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1627 goto Lconst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1628 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1629 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1630 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1631 { // foo(U:invariant(U)) T => nomatch |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1632 // foo(U:invariant(U)) const(T) => nomatch |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1633 if (!at) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1634 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1635 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1636 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1637 if (tt->equals(at)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1638 goto Lexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1639 else if (tt->ty == Tclass && at->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1640 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1641 return tt->implicitConvTo(at); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1642 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1643 else if (tt->ty == Tsarray && at->ty == Tarray && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1644 tt->nextOf()->implicitConvTo(at->nextOf()) >= MATCHconst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1645 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1646 goto Lexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1647 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1648 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1649 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1650 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1651 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1652 if (ty != tparam->ty) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1653 return implicitConvTo(tparam); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1654 // goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1655 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1656 if (nextOf()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1657 return nextOf()->deduceType(sc, tparam->nextOf(), parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1658 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1659 Lexact: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1660 return MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1661 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1662 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1663 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1664 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1665 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1666 Lconst: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1667 return MATCHconst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1668 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1669 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1670 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1671 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1672 MATCH TypeDArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1673 Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1674 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1675 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1676 printf("TypeDArray::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1677 printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1678 printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1679 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1680 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1681 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1682 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1683 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1684 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1685 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1686 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1687 MATCH TypeSArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1688 Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1689 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1690 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1691 printf("TypeSArray::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1692 printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1693 printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1694 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1695 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1696 // Extra check that array dimensions must match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1697 if (tparam) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1698 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1699 if (tparam->ty == Tsarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1700 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1701 TypeSArray *tp = (TypeSArray *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1702 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1703 if (tp->dim->op == TOKvar && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1704 ((VarExp *)tp->dim)->var->storage_class & STCtemplateparameter) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1705 { int i = templateIdentifierLookup(((VarExp *)tp->dim)->var->ident, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1706 // This code matches code in TypeInstance::deduceType() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1707 if (i == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1708 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1709 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1710 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1711 if (!tvp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1712 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1713 Expression *e = (Expression *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1714 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1715 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1716 if (!dim->equals(e)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1717 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1718 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1719 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1720 { Type *vt = tvp->valType->semantic(0, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1721 MATCH m = (MATCH)dim->implicitConvTo(vt); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1722 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1723 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1724 dedtypes->data[i] = dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1725 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1726 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1727 else if (dim->toInteger() != tp->dim->toInteger()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1728 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1729 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1730 else if (tparam->ty == Taarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1731 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1732 TypeAArray *tp = (TypeAArray *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1733 if (tp->index->ty == Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1734 { TypeIdentifier *tident = (TypeIdentifier *)tp->index; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1735 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1736 if (tident->idents.dim == 0) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1737 { Identifier *id = tident->ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1738 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1739 for (size_t i = 0; i < parameters->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1740 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1741 TemplateParameter *tp = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1742 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1743 if (tp->ident->equals(id)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1744 { // Found the corresponding template parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1745 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1746 if (!tvp || !tvp->valType->isintegral()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1747 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1748 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1749 if (dedtypes->data[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1750 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1751 if (!dim->equals((Object *)dedtypes->data[i])) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1752 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1753 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1754 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1755 { dedtypes->data[i] = (void *)dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1756 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1757 return next->deduceType(sc, tparam->nextOf(), parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1758 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1759 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1760 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1761 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1762 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1763 else if (tparam->ty == Tarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1764 { MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1765 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1766 m = next->deduceType(sc, tparam->nextOf(), parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1767 if (m == MATCHexact) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1768 m = MATCHconvert; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1769 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1770 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1771 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1772 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1773 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1774 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1775 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1776 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1777 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1778 MATCH TypeAArray::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1779 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1780 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1781 printf("TypeAArray::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1782 printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1783 printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1784 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1785 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1786 // Extra check that index type must match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1787 if (tparam && tparam->ty == Taarray) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1788 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1789 TypeAArray *tp = (TypeAArray *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1790 if (!index->deduceType(sc, tp->index, parameters, dedtypes)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1791 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1792 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1793 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1794 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1795 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1796 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1797 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1798 MATCH TypeFunction::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1799 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1800 //printf("TypeFunction::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1801 //printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1802 //printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1803 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1804 // Extra check that function characteristics must match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1805 if (tparam && tparam->ty == Tfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1806 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1807 TypeFunction *tp = (TypeFunction *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1808 if (varargs != tp->varargs || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1809 linkage != tp->linkage) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1810 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1811 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1812 size_t nfargs = Argument::dim(this->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1813 size_t nfparams = Argument::dim(tp->parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1814 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1815 /* See if tuple match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1816 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1817 if (nfparams > 0 && nfargs >= nfparams - 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1818 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1819 /* See if 'A' of the template parameter matches 'A' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1820 * of the type of the last function parameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1821 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1822 Argument *fparam = Argument::getNth(tp->parameters, nfparams - 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1823 assert(fparam); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1824 assert(fparam->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1825 if (fparam->type->ty != Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1826 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1827 TypeIdentifier *tid = (TypeIdentifier *)fparam->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1828 if (tid->idents.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1829 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1830 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1831 /* Look through parameters to find tuple matching tid->ident |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1832 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1833 size_t tupi = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1834 for (; 1; tupi++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1835 { if (tupi == parameters->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1836 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1837 TemplateParameter *t = (TemplateParameter *)parameters->data[tupi]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1838 TemplateTupleParameter *tup = t->isTemplateTupleParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1839 if (tup && tup->ident->equals(tid->ident)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1840 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1841 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1842 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1843 /* The types of the function arguments [nfparams - 1 .. nfargs] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1844 * now form the tuple argument. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1845 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1846 int tuple_dim = nfargs - (nfparams - 1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1847 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1848 /* See if existing tuple, and whether it matches or not |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1849 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1850 Object *o = (Object *)dedtypes->data[tupi]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1851 if (o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1852 { // Existing deduced argument must be a tuple, and must match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1853 Tuple *t = isTuple(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1854 if (!t || t->objects.dim != tuple_dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1855 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1856 for (size_t i = 0; i < tuple_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1857 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1858 if (!arg->type->equals((Object *)t->objects.data[i])) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1859 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1860 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1861 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1862 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1863 { // Create new tuple |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1864 Tuple *t = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1865 t->objects.setDim(tuple_dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1866 for (size_t i = 0; i < tuple_dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1867 { Argument *arg = Argument::getNth(this->parameters, nfparams - 1 + i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1868 t->objects.data[i] = (void *)arg->type; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1869 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1870 dedtypes->data[tupi] = (void *)t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1871 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1872 nfparams--; // don't consider the last parameter for type deduction |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1873 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1874 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1875 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1876 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1877 if (nfargs != nfparams) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1878 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1879 L2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1880 for (size_t i = 0; i < nfparams; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1881 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1882 Argument *a = Argument::getNth(this->parameters, i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1883 Argument *ap = Argument::getNth(tp->parameters, i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1884 if (a->storageClass != ap->storageClass || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1885 !a->type->deduceType(sc, ap->type, parameters, dedtypes)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1886 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1887 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1888 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1889 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1890 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1891 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1892 MATCH TypeIdentifier::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1893 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1894 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1895 if (tparam && tparam->ty == Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1896 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1897 TypeIdentifier *tp = (TypeIdentifier *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1898 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1899 for (int i = 0; i < idents.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1900 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1901 Identifier *id1 = (Identifier *)idents.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1902 Identifier *id2 = (Identifier *)tp->idents.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1903 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1904 if (!id1->equals(id2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1905 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1906 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1907 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1908 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1909 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1910 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1911 MATCH TypeInstance::deduceType(Scope *sc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1912 Type *tparam, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1913 Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1914 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1915 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1916 printf("TypeInstance::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1917 printf("\tthis = %d, ", ty); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1918 printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1919 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1920 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1921 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1922 if (tparam && tparam->ty == Tinstance) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1923 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1924 TypeInstance *tp = (TypeInstance *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1925 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1926 //printf("tempinst->tempdecl = %p\n", tempinst->tempdecl); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1927 //printf("tp->tempinst->tempdecl = %p\n", tp->tempinst->tempdecl); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1928 if (!tp->tempinst->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1929 { //printf("tp->tempinst->name = '%s'\n", tp->tempinst->name->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1930 if (!tp->tempinst->name->equals(tempinst->name)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1931 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1932 /* Handle case of: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1933 * template Foo(T : sa!(T), alias sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1934 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1935 int i = templateIdentifierLookup(tp->tempinst->name, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1936 if (i == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1937 { /* Didn't find it as a parameter identifier. Try looking |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1938 * it up and seeing if is an alias. See Bugzilla 1454 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1939 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1940 Dsymbol *s = tempinst->tempdecl->scope->search(0, tp->tempinst->name, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1941 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1942 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1943 s = s->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1944 TemplateDeclaration *td = s->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1945 if (td && td == tempinst->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1946 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1947 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1948 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1949 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1950 TemplateParameter *tpx = (TemplateParameter *)parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1951 // This logic duplicates tpx->matchArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1952 TemplateAliasParameter *ta = tpx->isTemplateAliasParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1953 if (!ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1954 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1955 Object *sa = tempinst->tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1956 if (!sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1957 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1958 if (ta->specAlias && sa != ta->specAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1959 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1960 if (dedtypes->data[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1961 { // Must match already deduced symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1962 Object *s = (Object *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1963 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1964 if (s != sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1965 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1966 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1967 dedtypes->data[i] = sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1968 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1969 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1970 else if (tempinst->tempdecl != tp->tempinst->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1971 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1972 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1973 L2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1974 |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1975 for (int i = 0; 1; i++) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1976 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1977 //printf("\ttest: tempinst->tiargs[%d]\n", i); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1978 Object *o1; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1979 if (i < tempinst->tiargs->dim) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1980 o1 = (Object *)tempinst->tiargs->data[i]; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1981 else if (i < tempinst->tdtypes.dim && i < tp->tempinst->tiargs->dim) |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1982 // Pick up default arg |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1983 o1 = (Object *)tempinst->tdtypes.data[i]; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1984 else |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1985 break; |
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
1986 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1987 if (i >= tp->tempinst->tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1988 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1989 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1990 Object *o2 = (Object *)tp->tempinst->tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1991 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1992 Type *t1 = isType(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1993 Type *t2 = isType(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1994 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1995 Expression *e1 = isExpression(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1996 Expression *e2 = isExpression(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1997 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1998 Dsymbol *s1 = isDsymbol(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
1999 Dsymbol *s2 = isDsymbol(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2000 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2001 Tuple *v1 = isTuple(o1); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2002 Tuple *v2 = isTuple(o2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2003 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2004 if (t1) printf("t1 = %s\n", t1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2005 if (t2) printf("t2 = %s\n", t2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2006 if (e1) printf("e1 = %s\n", e1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2007 if (e2) printf("e2 = %s\n", e2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2008 if (s1) printf("s1 = %s\n", s1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2009 if (s2) printf("s2 = %s\n", s2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2010 if (v1) printf("v1 = %s\n", v1->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2011 if (v2) printf("v2 = %s\n", v2->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2012 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2013 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2014 TemplateTupleParameter *ttp; |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2015 int j; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2016 if (t2 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2017 t2->ty == Tident && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2018 i == tp->tempinst->tiargs->dim - 1 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2019 i == tempinst->tempdecl->parameters->dim - 1 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2020 (ttp = tempinst->tempdecl->isVariadic()) != NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2021 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2022 /* Given: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2023 * struct A(B...) {} |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2024 * alias A!(int, float) X; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2025 * static if (!is(X Y == A!(Z), Z)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2026 * deduce that Z is a tuple(int, float) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2027 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2028 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2029 j = templateParameterLookup(t2, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2030 if (j == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2031 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2032 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2033 /* Create tuple from remaining args |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2034 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2035 Tuple *vt = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2036 int vtdim = tempinst->tiargs->dim - i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2037 vt->objects.setDim(vtdim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2038 for (size_t k = 0; k < vtdim; k++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2039 vt->objects.data[k] = (void *)tempinst->tiargs->data[i + k]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2040 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2041 Tuple *v = (Tuple *)dedtypes->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2042 if (v) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2043 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2044 if (!match(v, vt, tempinst->tempdecl, sc)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2045 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2046 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2047 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2048 dedtypes->data[j] = vt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2049 break; //return MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2050 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2051 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2052 if (t1 && t2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2053 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2054 if (!t1->deduceType(sc, t2, parameters, dedtypes)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2055 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2056 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2057 else if (e1 && e2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2058 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2059 if (!e1->equals(e2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2060 { if (e2->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2061 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2062 /* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2063 * (T:Number!(e2), int e2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2064 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2065 j = templateIdentifierLookup(((VarExp *)e2)->var->ident, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2066 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2067 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2068 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2069 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2070 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2071 else if (e1 && t2 && t2->ty == Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2072 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2073 j = templateParameterLookup(t2, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2074 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2075 if (j == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2076 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2077 TemplateParameter *tp = (TemplateParameter *)parameters->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2078 // BUG: use tp->matchArg() instead of the following |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2079 TemplateValueParameter *tv = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2080 if (!tv) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2081 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2082 Expression *e = (Expression *)dedtypes->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2083 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2084 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2085 if (!e1->equals(e)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2086 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2087 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2088 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2089 { Type *vt = tv->valType->semantic(0, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2090 MATCH m = (MATCH)e1->implicitConvTo(vt); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2091 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2092 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2093 dedtypes->data[j] = e1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2094 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2095 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2096 else if (s1 && t2 && t2->ty == Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2097 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2098 j = templateParameterLookup(t2, parameters); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2099 if (j == -1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2100 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2101 TemplateParameter *tp = (TemplateParameter *)parameters->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2102 // BUG: use tp->matchArg() instead of the following |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2103 TemplateAliasParameter *ta = tp->isTemplateAliasParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2104 if (!ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2105 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2106 Dsymbol *s = (Dsymbol *)dedtypes->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2107 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2108 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2109 if (!s1->equals(s)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2110 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2111 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2112 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2113 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2114 dedtypes->data[j] = s1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2115 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2116 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2117 else if (s1 && s2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2118 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2119 if (!s1->equals(s2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2120 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2121 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2122 // BUG: Need to handle tuple parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2123 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2124 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2125 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2126 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2127 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2128 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2129 Lnomatch: |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
2130 //printf("no match\n"); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2131 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2132 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2133 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2134 MATCH TypeStruct::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2135 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2136 //printf("TypeStruct::deduceType()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2137 //printf("\tthis->parent = %s, ", sym->parent->toChars()); print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2138 //printf("\ttparam = %d, ", tparam->ty); tparam->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2139 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2140 /* If this struct is a template struct, and we're matching |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2141 * it against a template instance, convert the struct type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2142 * to a template instance, too, and try again. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2143 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2144 TemplateInstance *ti = sym->parent->isTemplateInstance(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2145 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2146 if (tparam && tparam->ty == Tinstance) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2147 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2148 if (ti && ti->toAlias() == sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2149 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2150 TypeInstance *t = new TypeInstance(0, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2151 return t->deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2152 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2153 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2154 /* Match things like: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2155 * S!(T).foo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2156 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2157 TypeInstance *tpi = (TypeInstance *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2158 if (tpi->idents.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2159 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2160 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2161 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2162 Type *tparent = sym->parent->getType(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2163 if (tparent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2164 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2165 /* Slice off the .foo in S!(T).foo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2166 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2167 tpi->idents.dim--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2168 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2169 tpi->idents.dim++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2170 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2171 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2172 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2173 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2174 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2175 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2176 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2177 if (tparam && tparam->ty == Tstruct) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2178 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2179 TypeStruct *tp = (TypeStruct *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2181 if (sym != tp->sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2182 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2183 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2184 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2185 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2186 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2187 MATCH TypeEnum::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2188 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2189 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2190 if (tparam && tparam->ty == Tenum) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2191 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2192 TypeEnum *tp = (TypeEnum *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2193 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2194 if (sym != tp->sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2195 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2196 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2197 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2198 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2200 MATCH TypeTypedef::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2201 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2202 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2203 if (tparam && tparam->ty == Ttypedef) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2204 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2205 TypeTypedef *tp = (TypeTypedef *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2206 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2207 if (sym != tp->sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2208 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2209 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2210 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2211 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2212 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2213 MATCH TypeClass::deduceType(Scope *sc, Type *tparam, TemplateParameters *parameters, Objects *dedtypes) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2214 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2215 //printf("TypeClass::deduceType(this = %s)\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2216 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2217 /* If this class is a template class, and we're matching |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2218 * it against a template instance, convert the class type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2219 * to a template instance, too, and try again. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2220 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2221 TemplateInstance *ti = sym->parent->isTemplateInstance(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2222 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2223 if (tparam && tparam->ty == Tinstance) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2224 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2225 if (ti && ti->toAlias() == sym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2226 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2227 TypeInstance *t = new TypeInstance(0, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2228 return t->deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2229 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2230 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2231 /* Match things like: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2232 * S!(T).foo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2233 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2234 TypeInstance *tpi = (TypeInstance *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2235 if (tpi->idents.dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2236 { Identifier *id = (Identifier *)tpi->idents.data[tpi->idents.dim - 1]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2237 if (id->dyncast() == DYNCAST_IDENTIFIER && sym->ident->equals(id)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2238 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2239 Type *tparent = sym->parent->getType(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2240 if (tparent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2241 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2242 /* Slice off the .foo in S!(T).foo |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2243 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2244 tpi->idents.dim--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2245 MATCH m = tparent->deduceType(sc, tpi, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2246 tpi->idents.dim++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2247 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2248 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2249 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2250 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2251 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2252 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2253 // Extra check |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2254 if (tparam && tparam->ty == Tclass) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2255 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2256 TypeClass *tp = (TypeClass *)tparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2257 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2258 //printf("\t%d\n", (MATCH) implicitConvTo(tp)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2259 return implicitConvTo(tp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2260 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2261 return Type::deduceType(sc, tparam, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2262 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2263 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2264 /* ======================== TemplateParameter =============================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2265 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2266 TemplateParameter::TemplateParameter(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2267 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2268 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2269 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2270 this->sparam = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2271 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2272 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2273 TemplateTypeParameter *TemplateParameter::isTemplateTypeParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2274 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2275 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2276 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2277 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2278 TemplateValueParameter *TemplateParameter::isTemplateValueParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2279 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2280 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2281 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2282 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2283 TemplateAliasParameter *TemplateParameter::isTemplateAliasParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2284 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2285 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2286 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2287 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2288 TemplateTupleParameter *TemplateParameter::isTemplateTupleParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2289 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2290 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2291 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2292 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2293 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2294 TemplateThisParameter *TemplateParameter::isTemplateThisParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2295 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2296 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2297 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2298 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2299 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2300 /* ======================== TemplateTypeParameter =========================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2301 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2302 // type-parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2304 TemplateTypeParameter::TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2305 Type *defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2306 : TemplateParameter(loc, ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2307 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2308 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2309 this->specType = specType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2310 this->defaultType = defaultType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2311 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2312 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2313 TemplateTypeParameter *TemplateTypeParameter::isTemplateTypeParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2314 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2315 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2316 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2317 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2318 TemplateParameter *TemplateTypeParameter::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2319 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2320 TemplateTypeParameter *tp = new TemplateTypeParameter(loc, ident, specType, defaultType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2321 if (tp->specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2322 tp->specType = specType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2323 if (defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2324 tp->defaultType = defaultType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2325 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2326 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2327 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2328 void TemplateTypeParameter::declareParameter(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2329 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2330 //printf("TemplateTypeParameter::declareParameter('%s')\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2331 TypeIdentifier *ti = new TypeIdentifier(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2332 sparam = new AliasDeclaration(loc, ident, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2333 if (!sc->insert(sparam)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2334 error(loc, "parameter '%s' multiply defined", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2335 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2336 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2337 void TemplateTypeParameter::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2338 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2339 //printf("TemplateTypeParameter::semantic('%s')\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2340 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2341 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2342 specType = specType->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2343 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2344 #if 0 // Don't do semantic() until instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2345 if (defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2346 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2347 defaultType = defaultType->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2348 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2349 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2350 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2351 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2352 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2353 * Determine if two TemplateParameters are the same |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2354 * as far as TemplateDeclaration overloading goes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2355 * Returns: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2356 * 1 match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2357 * 0 no match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2358 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2359 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2360 int TemplateTypeParameter::overloadMatch(TemplateParameter *tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2361 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2362 TemplateTypeParameter *ttp = tp->isTemplateTypeParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2363 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2364 if (ttp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2365 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2366 if (specType != ttp->specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2367 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2368 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2369 if (specType && !specType->equals(ttp->specType)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2370 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2371 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2372 return 1; // match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2373 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2374 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2375 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2376 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2377 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2378 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2379 /******************************************* |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2380 * Match to a particular TemplateParameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2381 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2382 * i i'th argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2383 * tiargs[] actual arguments to template instance |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2384 * parameters[] template parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2385 * dedtypes[] deduced arguments to template instance |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2386 * *psparam set to symbol declared and initialized to dedtypes[i] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2387 * flags 1: don't do 'toHeadMutable()' |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2388 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2389 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2390 MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2391 int i, TemplateParameters *parameters, Objects *dedtypes, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2392 Declaration **psparam, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2393 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2394 //printf("TemplateTypeParameter::matchArg()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2395 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2396 Object *oarg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2397 MATCH m = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2398 Type *ta; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2399 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2400 if (i < tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2401 oarg = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2402 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2403 { // Get default argument instead |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2404 oarg = defaultArg(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2405 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2406 { assert(i < dedtypes->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2407 // It might have already been deduced |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2408 oarg = (Object *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2409 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2410 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2411 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2412 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2413 flags |= 1; // already deduced, so don't to toHeadMutable() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2414 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2415 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2416 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2417 ta = isType(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2418 if (!ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2419 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2420 //printf("%s %p %p %p\n", oarg->toChars(), isExpression(oarg), isDsymbol(oarg), isTuple(oarg)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2421 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2422 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2423 //printf("ta is %s\n", ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2424 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2425 t = (Type *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2426 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2427 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2428 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2429 //printf("\tcalling deduceType(): ta is %s, specType is %s\n", ta->toChars(), specType->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2430 MATCH m2 = ta->deduceType(sc, specType, parameters, dedtypes); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2431 if (m2 == MATCHnomatch) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2432 { //printf("\tfailed deduceType\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2433 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2434 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2435 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2436 if (m2 < m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2437 m = m2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2438 t = (Type *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2439 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2440 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2441 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2442 // So that matches with specializations are better |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2443 m = MATCHconvert; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2444 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2445 /* This is so that: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2446 * template Foo(T), Foo!(const int), => ta == int |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2447 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2448 // if (!(flags & 1)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2449 // ta = ta->toHeadMutable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2450 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2451 if (t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2452 { // Must match already deduced type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2453 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2454 m = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2455 if (!t->equals(ta)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2456 { //printf("t = %s ta = %s\n", t->toChars(), ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2457 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2458 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2459 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2460 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2461 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2462 if (!t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2463 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2464 dedtypes->data[i] = ta; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2465 t = ta; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2466 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2467 *psparam = new AliasDeclaration(loc, ident, t); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2468 //printf("\tm = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2469 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2470 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2471 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2472 *psparam = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2473 //printf("\tm = %d\n", MATCHnomatch); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2474 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2475 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2476 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2477 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2478 void TemplateTypeParameter::print(Object *oarg, Object *oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2479 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2480 printf(" %s\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2481 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2482 Type *t = isType(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2483 Type *ta = isType(oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2484 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2485 assert(ta); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2486 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2487 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2488 printf("\tSpecialization: %s\n", specType->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2489 if (defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2490 printf("\tDefault: %s\n", defaultType->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2491 printf("\tArgument: %s\n", t ? t->toChars() : "NULL"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2492 printf("\tDeduced Type: %s\n", ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2493 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2494 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2495 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2496 void TemplateTypeParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2497 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2498 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2499 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2500 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2501 buf->writestring(" : "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2502 specType->toCBuffer(buf, NULL, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2503 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2504 if (defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2505 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2506 buf->writestring(" = "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2507 defaultType->toCBuffer(buf, NULL, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2508 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2509 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2510 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2511 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2512 void *TemplateTypeParameter::dummyArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2513 { Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2514 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2515 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2516 t = specType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2517 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2518 { // Use this for alias-parameter's too (?) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2519 t = new TypeIdentifier(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2520 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2521 return (void *)t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2522 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2523 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2524 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2525 Object *TemplateTypeParameter::specialization() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2526 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2527 return specType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2528 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2529 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2530 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2531 Object *TemplateTypeParameter::defaultArg(Loc loc, Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2532 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2533 Type *t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2534 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2535 t = defaultType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2536 if (t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2537 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2538 t = t->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2539 t = t->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2540 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2541 return t; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2542 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2543 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2544 /* ======================== TemplateThisParameter =========================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2545 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2546 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2547 // this-parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2548 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2549 TemplateThisParameter::TemplateThisParameter(Loc loc, Identifier *ident, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2550 Type *specType, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2551 Type *defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2552 : TemplateTypeParameter(loc, ident, specType, defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2553 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2554 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2555 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2556 TemplateThisParameter *TemplateThisParameter::isTemplateThisParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2557 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2558 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2559 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2560 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2561 TemplateParameter *TemplateThisParameter::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2562 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2563 TemplateThisParameter *tp = new TemplateThisParameter(loc, ident, specType, defaultType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2564 if (tp->specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2565 tp->specType = specType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2566 if (defaultType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2567 tp->defaultType = defaultType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2568 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2569 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2570 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2571 void TemplateThisParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2572 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2573 buf->writestring("this "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2574 TemplateTypeParameter::toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2575 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2576 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2577 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2578 /* ======================== TemplateAliasParameter ========================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2579 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2580 // alias-parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2581 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2582 Dsymbol *TemplateAliasParameter::sdummy = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2583 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2584 TemplateAliasParameter::TemplateAliasParameter(Loc loc, Identifier *ident, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2585 Type *specType, Object *specAlias, Object *defaultAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2586 : TemplateParameter(loc, ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2587 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2588 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2589 this->specType = specType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2590 this->specAlias = specAlias; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2591 this->defaultAlias = defaultAlias; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2592 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2593 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2594 TemplateAliasParameter *TemplateAliasParameter::isTemplateAliasParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2595 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2596 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2597 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2598 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2599 TemplateParameter *TemplateAliasParameter::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2600 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2601 TemplateAliasParameter *tp = new TemplateAliasParameter(loc, ident, specType, specAlias, defaultAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2602 if (tp->specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2603 tp->specType = specType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2604 tp->specAlias = objectSyntaxCopy(specAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2605 tp->defaultAlias = objectSyntaxCopy(defaultAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2606 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2607 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2608 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2609 void TemplateAliasParameter::declareParameter(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2610 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2611 TypeIdentifier *ti = new TypeIdentifier(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2612 sparam = new AliasDeclaration(loc, ident, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2613 if (!sc->insert(sparam)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2614 error(loc, "parameter '%s' multiply defined", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2615 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2616 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2617 Object *aliasParameterSemantic(Loc loc, Scope *sc, Object *o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2618 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2619 if (o) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2620 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2621 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2622 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2623 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2624 { Dsymbol *s = ta->toDsymbol(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2625 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2626 o = s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2627 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2628 o = ta->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2629 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2630 else if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2631 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2632 ea = ea->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2633 o = ea->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2634 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2635 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2636 return o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2637 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2638 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2639 void TemplateAliasParameter::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2640 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2641 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2642 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2643 specType = specType->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2644 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2645 specAlias = aliasParameterSemantic(loc, sc, specAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2646 #if 0 // Don't do semantic() until instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2647 if (defaultAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2648 defaultAlias = defaultAlias->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2649 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2650 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2651 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2652 int TemplateAliasParameter::overloadMatch(TemplateParameter *tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2653 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2654 TemplateAliasParameter *tap = tp->isTemplateAliasParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2655 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2656 if (tap) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2657 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2658 if (specAlias != tap->specAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2659 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2660 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2661 return 1; // match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2662 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2663 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2664 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2665 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2666 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2667 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2668 MATCH TemplateAliasParameter::matchArg(Scope *sc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2669 Objects *tiargs, int i, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2670 Objects *dedtypes, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2671 Declaration **psparam, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2672 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2673 Object *sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2674 Object *oarg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2675 Expression *ea; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2676 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2677 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2678 //printf("TemplateAliasParameter::matchArg()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2679 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2680 if (i < tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2681 oarg = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2682 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2683 { // Get default argument instead |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2684 oarg = defaultArg(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2685 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2686 { assert(i < dedtypes->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2687 // It might have already been deduced |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2688 oarg = (Object *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2689 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2690 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2691 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2692 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2693 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2694 sa = getDsymbol(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2695 if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2696 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2697 /* specType means the alias must be a declaration with a type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2698 * that matches specType. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2699 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2700 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2701 { Declaration *d = ((Dsymbol *)sa)->isDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2702 if (!d) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2703 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2704 if (!d->type->equals(specType)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2705 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2706 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2707 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2708 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2709 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2710 sa = oarg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2711 ea = isExpression(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2712 if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2713 { if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2714 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2715 if (!ea->type->equals(specType)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2716 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2717 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2718 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2719 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2720 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2721 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2722 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2723 if (specAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2724 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2725 if (sa == sdummy) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2726 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2727 if (sa != specAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2728 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2729 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2730 else if (dedtypes->data[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2731 { // Must match already deduced symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2732 Object *s = (Object *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2733 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2734 if (!sa || s != sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2735 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2736 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2737 dedtypes->data[i] = sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2738 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2739 s = isDsymbol(sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2740 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2741 *psparam = new AliasDeclaration(loc, ident, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2742 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2743 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2744 assert(ea); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2745 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2746 // Declare manifest constant |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2747 Initializer *init = new ExpInitializer(loc, ea); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2748 VarDeclaration *v = new VarDeclaration(loc, NULL, ident, init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2749 v->storage_class = STCmanifest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2750 v->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2751 *psparam = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2752 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2753 return MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2754 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2755 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2756 *psparam = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2757 //printf("\tm = %d\n", MATCHnomatch); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2758 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2759 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2760 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2761 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2762 void TemplateAliasParameter::print(Object *oarg, Object *oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2763 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2764 printf(" %s\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2765 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2766 Dsymbol *sa = isDsymbol(oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2767 assert(sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2768 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2769 printf("\tArgument alias: %s\n", sa->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2770 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2771 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2772 void TemplateAliasParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2773 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2774 buf->writestring("alias "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2775 if (specType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2776 { HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2777 specType->toCBuffer(buf, ident, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2778 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2779 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2780 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2781 if (specAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2782 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2783 buf->writestring(" : "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2784 ObjectToCBuffer(buf, hgs, specAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2785 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2786 if (defaultAlias) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2787 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2788 buf->writestring(" = "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2789 ObjectToCBuffer(buf, hgs, defaultAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2790 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2791 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2792 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2793 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2794 void *TemplateAliasParameter::dummyArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2795 { Object *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2796 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2797 s = specAlias; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2798 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2799 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2800 if (!sdummy) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2801 sdummy = new Dsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2802 s = sdummy; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2803 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2804 return (void*)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2805 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2806 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2807 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2808 Object *TemplateAliasParameter::specialization() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2809 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2810 return specAlias; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2811 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2812 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2813 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2814 Object *TemplateAliasParameter::defaultArg(Loc loc, Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2815 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2816 Object *o = aliasParameterSemantic(loc, sc, defaultAlias); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2817 return o; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2818 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2819 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2820 /* ======================== TemplateValueParameter ========================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2821 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2822 // value-parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2823 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2824 Expression *TemplateValueParameter::edummy = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2826 TemplateValueParameter::TemplateValueParameter(Loc loc, Identifier *ident, Type *valType, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2827 Expression *specValue, Expression *defaultValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2828 : TemplateParameter(loc, ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2829 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2830 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2831 this->valType = valType; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2832 this->specValue = specValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2833 this->defaultValue = defaultValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2834 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2835 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2836 TemplateValueParameter *TemplateValueParameter::isTemplateValueParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2837 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2838 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2839 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2840 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2841 TemplateParameter *TemplateValueParameter::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2842 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2843 TemplateValueParameter *tp = |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2844 new TemplateValueParameter(loc, ident, valType, specValue, defaultValue); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2845 tp->valType = valType->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2846 if (specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2847 tp->specValue = specValue->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2848 if (defaultValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2849 tp->defaultValue = defaultValue->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2850 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2851 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2852 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2853 void TemplateValueParameter::declareParameter(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2854 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2855 VarDeclaration *v = new VarDeclaration(loc, valType, ident, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2856 v->storage_class = STCtemplateparameter; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2857 if (!sc->insert(v)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2858 error(loc, "parameter '%s' multiply defined", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2859 sparam = v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2860 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2861 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2862 void TemplateValueParameter::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2863 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2864 sparam->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2865 valType = valType->semantic(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2866 if (!(valType->isintegral() || valType->isfloating() || valType->isString()) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2867 valType->ty != Tident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2868 error(loc, "arithmetic/string type expected for value-parameter, not %s", valType->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2869 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2870 if (specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2871 { Expression *e = specValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2872 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2873 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2874 e = e->implicitCastTo(sc, valType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2875 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2876 if (e->op == TOKint64 || e->op == TOKfloat64 || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2877 e->op == TOKcomplex80 || e->op == TOKnull || e->op == TOKstring) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2878 specValue = e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2879 //e->toInteger(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2880 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2881 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2882 #if 0 // defer semantic analysis to arg match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2883 if (defaultValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2884 { Expression *e = defaultValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2885 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2886 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2887 e = e->implicitCastTo(sc, valType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2888 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2889 if (e->op == TOKint64) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2890 defaultValue = e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2891 //e->toInteger(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2892 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2893 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2894 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2895 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2896 int TemplateValueParameter::overloadMatch(TemplateParameter *tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2897 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2898 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2899 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2900 if (tvp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2901 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2902 if (valType != tvp->valType) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2903 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2904 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2905 if (valType && !valType->equals(tvp->valType)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2906 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2907 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2908 if (specValue != tvp->specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2909 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2910 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2911 return 1; // match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2912 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2913 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2914 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2915 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2916 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2917 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2918 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2919 MATCH TemplateValueParameter::matchArg(Scope *sc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2920 Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2921 Declaration **psparam, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2922 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2923 //printf("TemplateValueParameter::matchArg()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2924 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2925 Initializer *init; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2926 Declaration *sparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2927 MATCH m = MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2928 Expression *ei; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2929 Object *oarg; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2930 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2931 if (i < tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2932 oarg = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2933 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2934 { // Get default argument instead |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2935 oarg = defaultArg(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2936 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2937 { assert(i < dedtypes->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2938 // It might have already been deduced |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2939 oarg = (Object *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2940 if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2941 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2942 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2943 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2944 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2945 ei = isExpression(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2946 Type *vt; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2947 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2948 if (!ei && oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2949 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2950 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2951 if (ei && ei->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2952 { // Resolve const variables that we had skipped earlier |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2953 ei = ei->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2954 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2955 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2956 if (specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2957 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2958 if (!ei || ei == edummy) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2959 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2960 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2961 Expression *e = specValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2962 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2963 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2964 e = e->implicitCastTo(sc, valType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2965 e = e->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2966 //e->type = e->type->toHeadMutable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2967 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2968 ei = ei->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2969 ei = ei->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2970 ei = ei->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2971 //ei->type = ei->type->toHeadMutable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2972 //printf("\tei: %s, %s\n", ei->toChars(), ei->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2973 //printf("\te : %s, %s\n", e->toChars(), e->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2974 if (!ei->equals(e)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2975 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2976 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2977 else if (dedtypes->data[i]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2978 { // Must match already deduced value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2979 Expression *e = (Expression *)dedtypes->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2980 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2981 if (!ei || !ei->equals(e)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2982 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2983 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2984 Lmatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2985 //printf("\tvalType: %s, ty = %d\n", valType->toChars(), valType->ty); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2986 vt = valType->semantic(0, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2987 //printf("ei: %s, ei->type: %s\n", ei->toChars(), ei->type->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2988 //printf("vt = %s\n", vt->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2989 if (ei->type) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2990 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2991 m = (MATCH)ei->implicitConvTo(vt); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2992 //printf("m: %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2993 if (!m) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2994 goto Lnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2995 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2996 dedtypes->data[i] = ei; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2997 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2998 init = new ExpInitializer(loc, ei); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
2999 sparam = new VarDeclaration(loc, vt, ident, init); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3000 sparam->storage_class = STCmanifest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3001 *psparam = sparam; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3002 return m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3003 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3004 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3005 //printf("\tno match\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3006 *psparam = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3007 return MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3008 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3009 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3010 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3011 void TemplateValueParameter::print(Object *oarg, Object *oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3012 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3013 printf(" %s\n", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3014 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3015 Expression *ea = isExpression(oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3016 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3017 if (specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3018 printf("\tSpecialization: %s\n", specValue->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3019 printf("\tArgument Value: %s\n", ea ? ea->toChars() : "NULL"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3020 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3021 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3022 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3023 void TemplateValueParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3024 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3025 valType->toCBuffer(buf, ident, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3026 if (specValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3027 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3028 buf->writestring(" : "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3029 specValue->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3030 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3031 if (defaultValue) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3032 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3033 buf->writestring(" = "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3034 defaultValue->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3035 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3036 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3037 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3038 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3039 void *TemplateValueParameter::dummyArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3040 { Expression *e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3041 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3042 e = specValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3043 if (!e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3044 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3045 // Create a dummy value |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3046 if (!edummy) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3047 edummy = valType->defaultInit(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3048 e = edummy; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3049 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3050 return (void *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3051 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3052 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3053 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3054 Object *TemplateValueParameter::specialization() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3055 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3056 return specValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3057 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3058 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3059 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3060 Object *TemplateValueParameter::defaultArg(Loc loc, Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3061 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3062 Expression *e = defaultValue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3063 if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3064 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3065 e = e->syntaxCopy(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3066 e = e->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3067 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3068 if (e->op == TOKdefault) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3069 { DefaultInitExp *de = (DefaultInitExp *)e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3070 e = de->resolve(loc, sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3071 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3072 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3073 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3074 return e; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3075 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3076 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3077 /* ======================== TemplateTupleParameter ========================== */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3078 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3079 // variadic-parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3080 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3081 TemplateTupleParameter::TemplateTupleParameter(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3082 : TemplateParameter(loc, ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3083 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3084 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3085 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3086 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3087 TemplateTupleParameter *TemplateTupleParameter::isTemplateTupleParameter() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3088 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3089 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3090 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3091 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3092 TemplateParameter *TemplateTupleParameter::syntaxCopy() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3093 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3094 TemplateTupleParameter *tp = new TemplateTupleParameter(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3095 return tp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3096 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3097 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3098 void TemplateTupleParameter::declareParameter(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3099 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3100 TypeIdentifier *ti = new TypeIdentifier(loc, ident); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3101 sparam = new AliasDeclaration(loc, ident, ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3102 if (!sc->insert(sparam)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3103 error(loc, "parameter '%s' multiply defined", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3104 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3105 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3106 void TemplateTupleParameter::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3107 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3108 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3109 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3110 int TemplateTupleParameter::overloadMatch(TemplateParameter *tp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3111 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3112 TemplateTupleParameter *tvp = tp->isTemplateTupleParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3113 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3114 if (tvp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3115 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3116 return 1; // match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3117 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3118 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3119 Lnomatch: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3120 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3121 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3122 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3123 MATCH TemplateTupleParameter::matchArg(Scope *sc, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3124 Objects *tiargs, int i, TemplateParameters *parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3125 Objects *dedtypes, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3126 Declaration **psparam, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3127 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3128 //printf("TemplateTupleParameter::matchArg()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3129 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3130 /* The rest of the actual arguments (tiargs[]) form the match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3131 * for the variadic parameter. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3132 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3133 assert(i + 1 == dedtypes->dim); // must be the last one |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3134 Tuple *ovar; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3135 if (i + 1 == tiargs->dim && isTuple((Object *)tiargs->data[i])) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3136 ovar = isTuple((Object *)tiargs->data[i]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3137 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3138 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3139 ovar = new Tuple(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3140 //printf("ovar = %p\n", ovar); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3141 if (i < tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3142 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3143 //printf("i = %d, tiargs->dim = %d\n", i, tiargs->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3144 ovar->objects.setDim(tiargs->dim - i); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3145 for (size_t j = 0; j < ovar->objects.dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3146 ovar->objects.data[j] = tiargs->data[i + j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3147 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3148 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3149 *psparam = new TupleDeclaration(loc, ident, &ovar->objects); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3150 dedtypes->data[i] = (void *)ovar; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3151 return MATCHexact; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3152 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3153 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3154 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3155 void TemplateTupleParameter::print(Object *oarg, Object *oded) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3156 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3157 printf(" %s... [", ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3158 Tuple *v = isTuple(oded); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3159 assert(v); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3160 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3161 //printf("|%d| ", v->objects.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3162 for (int i = 0; i < v->objects.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3163 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3164 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3165 printf(", "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3166 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3167 Object *o = (Object *)v->objects.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3168 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3169 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3170 if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3171 printf("alias: %s", sa->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3172 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3173 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3174 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3175 printf("type: %s", ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3176 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3177 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3178 if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3179 printf("exp: %s", ea->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3180 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3181 assert(!isTuple(o)); // no nested Tuple arguments |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3182 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3183 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3184 printf("]\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3185 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3186 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3187 void TemplateTupleParameter::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3188 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3189 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3190 buf->writestring("..."); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3191 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3192 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3193 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3194 void *TemplateTupleParameter::dummyArg() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3195 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3196 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3197 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3198 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3199 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3200 Object *TemplateTupleParameter::specialization() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3201 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3202 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3203 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3204 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3205 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3206 Object *TemplateTupleParameter::defaultArg(Loc loc, Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3207 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3208 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3209 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3210 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3211 /* ======================== TemplateInstance ================================ */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3212 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3213 TemplateInstance::TemplateInstance(Loc loc, Identifier *ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3214 : ScopeDsymbol(NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3215 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3216 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3217 printf("TemplateInstance(this = %p, ident = '%s')\n", this, ident ? ident->toChars() : "null"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3218 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3219 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3220 this->name = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3221 this->tiargs = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3222 this->tempdecl = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3223 this->inst = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3224 this->tinst = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3225 this->argsym = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3226 this->aliasdecl = NULL; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3227 this->semanticRun = 0; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3228 this->semantictiargsdone = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3229 this->withsym = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3230 this->nest = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3231 this->havetempdecl = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3232 this->isnested = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3233 this->errors = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3234 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3235 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3236 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3237 this->emittedInModule = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3238 this->tmodule = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3239 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3240 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3241 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3242 /***************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3243 * This constructor is only called when we figured out which function |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3244 * template to instantiate. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3245 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3246 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3247 TemplateInstance::TemplateInstance(Loc loc, TemplateDeclaration *td, Objects *tiargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3248 : ScopeDsymbol(NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3249 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3250 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3251 printf("TemplateInstance(this = %p, tempdecl = '%s')\n", this, td->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3252 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3253 this->loc = loc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3254 this->name = td->ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3255 this->tiargs = tiargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3256 this->tempdecl = td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3257 this->inst = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3258 this->tinst = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3259 this->argsym = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3260 this->aliasdecl = NULL; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3261 this->semanticRun = 0; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3262 this->semantictiargsdone = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3263 this->withsym = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3264 this->nest = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3265 this->havetempdecl = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3266 this->isnested = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3267 this->errors = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3268 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3269 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3270 // LDC |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3271 this->tinst = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3272 this->tmodule = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3273 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3274 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3275 assert((size_t)tempdecl->scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3276 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3277 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3278 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3279 Objects *TemplateInstance::arraySyntaxCopy(Objects *objs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3280 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3281 Objects *a = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3282 if (objs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3283 { a = new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3284 a->setDim(objs->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3285 for (size_t i = 0; i < objs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3286 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3287 a->data[i] = objectSyntaxCopy((Object *)objs->data[i]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3288 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3289 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3290 return a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3291 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3292 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3293 Dsymbol *TemplateInstance::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3294 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3295 TemplateInstance *ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3296 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3297 if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3298 ti = (TemplateInstance *)s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3299 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3300 ti = new TemplateInstance(loc, name); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3301 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3302 ti->tiargs = arraySyntaxCopy(tiargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3303 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3304 ScopeDsymbol::syntaxCopy(ti); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3305 return ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3306 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3307 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3308 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3309 void TemplateInstance::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3310 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3311 if (global.errors) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3312 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3313 if (!global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3314 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3315 /* Trying to soldier on rarely generates useful messages |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3316 * at this point. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3317 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3318 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3319 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3320 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3321 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3322 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3323 printf("\n+TemplateInstance::semantic('%s', this=%p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3324 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3325 if (inst) // if semantic() was already run |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3326 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3327 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3328 printf("-TemplateInstance::semantic('%s', this=%p) already run\n", inst->toChars(), inst); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3329 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3330 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3331 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3332 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3333 // get the enclosing template instance from the scope tinst |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3334 tinst = sc->tinst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3335 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3336 if (semanticRun != 0) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3337 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3338 error(loc, "recursive template expansion"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3339 // inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3340 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3341 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3342 semanticRun = 1; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3343 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3344 // get the enclosing template instance from the scope tinst |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3345 tinst = sc->tinst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3346 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3347 // get the module of the outermost enclosing instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3348 if (tinst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3349 tmodule = tinst->tmodule; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3350 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3351 tmodule = sc->module; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3352 //printf("%s in %s\n", toChars(), tmodule->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3353 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3354 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3355 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3356 printf("\tdo semantic\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3357 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3358 if (havetempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3359 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3360 assert((size_t)tempdecl->scope > 0x10000); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3361 // Deduce tdtypes |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3362 tdtypes.setDim(tempdecl->parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3363 if (!tempdecl->matchWithInstance(this, &tdtypes, 2)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3364 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3365 error("incompatible arguments for template instantiation"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3366 inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3367 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3368 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3369 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3370 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3371 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3372 /* Run semantic on each argument, place results in tiargs[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3373 * (if we havetempdecl, then tiargs is already evaluated) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3374 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3375 semanticTiargs(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3376 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3377 tempdecl = findTemplateDeclaration(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3378 if (tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3379 tempdecl = findBestMatch(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3380 if (!tempdecl || global.errors) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3381 { inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3382 //printf("error return %p, %d\n", tempdecl, global.errors); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3383 return; // error recovery |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3384 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3385 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3386 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3387 hasNestedArgs(tiargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3388 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3389 /* See if there is an existing TemplateInstantiation that already |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3390 * implements the typeargs. If so, just refer to that one instead. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3391 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3392 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3393 for (size_t i = 0; i < tempdecl->instances.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3394 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3395 TemplateInstance *ti = (TemplateInstance *)tempdecl->instances.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3396 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3397 printf("\t%s: checking for match with instance %d (%p): '%s'\n", toChars(), i, ti, ti->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3398 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3399 assert(tdtypes.dim == ti->tdtypes.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3400 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3401 // Nesting must match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3402 if (isnested != ti->isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3403 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3404 //printf("test2 isnested %s ti->isnested %s\n", isnested ? isnested->toChars() : "", ti->isnested ? ti->isnested->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3405 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3406 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3407 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3408 if (isnested && sc->parent != ti->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3409 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3410 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3411 for (size_t j = 0; j < tdtypes.dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3412 { Object *o1 = (Object *)tdtypes.data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3413 Object *o2 = (Object *)ti->tdtypes.data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3414 if (!match(o1, o2, tempdecl, sc)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3415 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3416 goto L1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3417 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3418 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3419 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3420 // It's a match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3421 inst = ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3422 parent = ti->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3423 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3424 printf("\tit's a match with instance %p\n", inst); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3425 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3426 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3427 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3428 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3429 ; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3430 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3431 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3432 /* So, we need to implement 'this' instance. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3433 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3434 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3435 printf("\timplement template instance '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3436 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3437 unsigned errorsave = global.errors; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3438 inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3439 int tempdecl_instance_idx = tempdecl->instances.dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3440 tempdecl->instances.push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3441 parent = tempdecl->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3442 //printf("parent = '%s'\n", parent->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3443 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3444 ident = genIdent(); // need an identifier for name mangling purposes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3445 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3446 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3447 if (isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3448 parent = isnested; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3449 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3450 //printf("parent = '%s'\n", parent->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3451 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3452 // Add 'this' to the enclosing scope's members[] so the semantic routines |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3453 // will get called on the instance members |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3454 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3455 int dosemantic3 = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3456 { Array *a; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3457 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3458 Scope *scx = sc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3459 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3460 for (scx = sc; scx; scx = scx->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3461 if (scx->scopesym) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3462 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3463 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3464 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3465 //if (scx && scx->scopesym) printf("3: scx is %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3466 if (scx && scx->scopesym && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3467 scx->scopesym->members && !scx->scopesym->isTemplateMixin() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3468 #if 0 // removed because it bloated compile times |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3469 /* The problem is if A imports B, and B imports A, and both A |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3470 * and B instantiate the same template, does the compilation of A |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3471 * or the compilation of B do the actual instantiation? |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3472 * |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3473 * see bugzilla 2500. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3474 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3475 && !scx->module->selfImports() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3476 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3477 ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3478 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3479 //printf("\t1: adding to %s %s\n", scx->scopesym->kind(), scx->scopesym->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3480 a = scx->scopesym->members; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3481 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3482 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3483 { Module *m = sc->module->importedFrom; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3484 //printf("\t2: adding to module %s instead of module %s\n", m->toChars(), sc->module->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3485 a = m->members; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3486 if (m->semanticRun >= 3) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3487 dosemantic3 = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3488 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3489 for (int i = 0; 1; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3490 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3491 if (i == a->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3492 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3493 a->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3494 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3495 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3496 if (this == (Dsymbol *)a->data[i]) // if already in Array |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3497 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3498 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3499 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3500 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3501 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3502 // Copy the syntax trees from the TemplateDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3503 members = Dsymbol::arraySyntaxCopy(tempdecl->members); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3504 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3505 // Create our own scope for the template parameters |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3506 Scope *scope = tempdecl->scope; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3507 if (!tempdecl->semanticRun) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3508 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3509 error("template instantiation %s forward references template declaration %s\n", toChars(), tempdecl->toChars()); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3510 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3511 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3512 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3513 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3514 printf("\tcreate scope for template parameters '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3515 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3516 argsym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3517 argsym->parent = scope->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3518 scope = scope->push(argsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3519 // scope->stc = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3520 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3521 // Declare each template parameter as an alias for the argument type |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3522 Scope *paramscope = scope->push(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3523 paramscope->stc = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3524 declareParameters(paramscope); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3525 paramscope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3526 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3527 // Add members of template instance to template instance symbol table |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3528 // parent = scope->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3529 symtab = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3530 int memnum = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3531 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3532 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3533 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3534 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3535 printf("\t[%d] adding member '%s' %p kind %s to '%s', memnum = %d\n", i, s->toChars(), s, s->kind(), this->toChars(), memnum); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3536 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3537 memnum |= s->addMember(scope, this, memnum); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3538 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3539 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3540 printf("adding members done\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3541 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3542 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3543 /* See if there is only one member of template instance, and that |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3544 * member has the same name as the template instance. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3545 * If so, this template instance becomes an alias for that member. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3546 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3547 //printf("members->dim = %d\n", members->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3548 if (members->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3549 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3550 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3551 if (Dsymbol::oneMembers(members, &s) && s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3552 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3553 //printf("s->kind = '%s'\n", s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3554 //s->print(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3555 //printf("'%s', '%s'\n", s->ident->toChars(), tempdecl->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3556 if (s->ident && s->ident->equals(tempdecl->ident)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3557 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3558 //printf("setting aliasdecl\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3559 aliasdecl = new AliasDeclaration(loc, s->ident, s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3560 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3561 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3562 // LDC propagate internal information |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3563 if (tempdecl->llvmInternal) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3564 s->llvmInternal = tempdecl->llvmInternal; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3565 if (FuncDeclaration* fd = s->isFuncDeclaration()) { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3566 fd->intrinsicName = tempdecl->intrinsicName; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3567 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3568 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3569 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3570 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3571 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3572 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3573 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3574 // Do semantic() analysis on template instance members |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3575 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3576 printf("\tdo semantic() on template instance members '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3577 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3578 Scope *sc2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3579 sc2 = scope->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3580 //printf("isnested = %d, sc->parent = %s\n", isnested, sc->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3581 sc2->parent = /*isnested ? sc->parent :*/ this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3582 sc2->tinst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3583 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3584 #if WINDOWS_SEH |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3585 __try |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3586 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3587 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3588 static int nest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3589 //printf("%d\n", nest); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3590 if (++nest > 500) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3591 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3592 global.gag = 0; // ensure error message gets printed |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3593 error("recursive expansion"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3594 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3595 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3596 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3597 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3598 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3599 //printf("\t[%d] semantic on '%s' %p kind %s in '%s'\n", i, s->toChars(), s, s->kind(), this->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3600 //printf("test: isnested = %d, sc2->parent = %s\n", isnested, sc2->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3601 // if (isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3602 // s->parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3603 //printf("test3: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3604 s->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3605 //printf("test4: isnested = %d, s->parent = %s\n", isnested, s->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3606 sc2->module->runDeferredSemantic(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3607 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3608 --nest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3609 #if WINDOWS_SEH |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3610 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3611 __except (__ehfilter(GetExceptionInformation())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3612 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3613 global.gag = 0; // ensure error message gets printed |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3614 error("recursive expansion"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3615 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3616 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3617 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3618 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3619 /* If any of the instantiation members didn't get semantic() run |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3620 * on them due to forward references, we cannot run semantic2() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3621 * or semantic3() yet. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3622 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3623 for (size_t i = 0; i < Module::deferred.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3624 { Dsymbol *sd = (Dsymbol *)Module::deferred.data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3625 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3626 if (sd->parent == this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3627 goto Laftersemantic; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3628 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3629 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3630 /* The problem is when to parse the initializer for a variable. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3631 * Perhaps VarDeclaration::semantic() should do it like it does |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3632 * for initializers inside a function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3633 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3634 // if (sc->parent->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3635 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3636 /* BUG 782: this has problems if the classes this depends on |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3637 * are forward referenced. Find a way to defer semantic() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3638 * on this template. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3639 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3640 semantic2(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3641 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3642 if (sc->func || dosemantic3) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3643 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3644 semantic3(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3645 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3646 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3647 Laftersemantic: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3648 sc2->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3649 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3650 scope->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3651 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3652 // Give additional context info if error occurred during instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3653 if (global.errors != errorsave) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3654 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3655 error("error instantiating"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3656 if (tinst && !global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3657 { tinst->printInstantiationTrace(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3658 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3659 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3660 errors = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3661 if (global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3662 tempdecl->instances.remove(tempdecl_instance_idx); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3663 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3664 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3665 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3666 printf("-TemplateInstance::semantic('%s', this=%p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3667 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3668 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3669 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3670 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3671 void TemplateInstance::semanticTiargs(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3672 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3673 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3674 if (semantictiargsdone) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3675 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3676 semantictiargsdone = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3677 semanticTiargs(loc, sc, tiargs, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3678 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3679 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3680 /********************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3681 * Input: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3682 * flags 1: replace const variables with their initializers |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3683 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3684 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3685 void TemplateInstance::semanticTiargs(Loc loc, Scope *sc, Objects *tiargs, int flags) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3686 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3687 // Run semantic on each argument, place results in tiargs[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3688 //printf("+TemplateInstance::semanticTiargs() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3689 if (!tiargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3690 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3691 for (size_t j = 0; j < tiargs->dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3692 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3693 Object *o = (Object *)tiargs->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3694 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3695 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3696 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3697 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3698 //printf("1: tiargs->data[%d] = %p, %p, %p, ea=%p, ta=%p\n", j, o, isDsymbol(o), isTuple(o), ea, ta); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3699 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3700 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3701 //printf("type %s\n", ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3702 // It might really be an Expression or an Alias |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3703 ta->resolve(loc, sc, &ea, &ta, &sa); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3704 if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3705 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3706 ea = ea->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3707 /* This test is to skip substituting a const var with |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3708 * its initializer. The problem is the initializer won't |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3709 * match with an 'alias' parameter. Instead, do the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3710 * const substitution in TemplateValueParameter::matchArg(). |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3711 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3712 if (ea->op != TOKvar || flags & 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3713 ea = ea->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3714 tiargs->data[j] = ea; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3715 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3716 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3717 { tiargs->data[j] = sa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3718 TupleDeclaration *d = sa->toAlias()->isTupleDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3719 if (d) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3720 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3721 size_t dim = d->objects->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3722 tiargs->remove(j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3723 tiargs->insert(j, d->objects); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3724 j--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3725 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3726 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3727 else if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3728 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3729 Ltype: |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3730 if (ta->ty == Ttuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3731 { // Expand tuple |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3732 TypeTuple *tt = (TypeTuple *)ta; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3733 size_t dim = tt->arguments->dim; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3734 tiargs->remove(j); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3735 if (dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3736 { tiargs->reserve(dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3737 for (size_t i = 0; i < dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3738 { Argument *arg = (Argument *)tt->arguments->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3739 tiargs->insert(j + i, arg->type); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3740 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3741 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3742 j--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3743 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3744 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3745 tiargs->data[j] = ta; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3746 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3747 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3748 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3749 assert(global.errors); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3750 tiargs->data[j] = Type::terror; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3751 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3752 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3753 else if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3754 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3755 if (!ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3756 { assert(global.errors); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3757 ea = new IntegerExp(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3758 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3759 assert(ea); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3760 ea = ea->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3761 if (ea->op != TOKvar || flags & 1) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3762 ea = ea->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3763 tiargs->data[j] = ea; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3764 if (ea->op == TOKtype) |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3765 { ta = ea->type; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3766 goto Ltype; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3767 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3768 if (ea->op == TOKtuple) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3769 { // Expand tuple |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3770 TupleExp *te = (TupleExp *)ea; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3771 size_t dim = te->exps->dim; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3772 tiargs->remove(j); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3773 if (dim) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3774 { tiargs->reserve(dim); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3775 for (size_t i = 0; i < dim; i++) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3776 tiargs->insert(j + i, te->exps->data[i]); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3777 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3778 j--; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3779 } |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3780 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3781 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3782 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3783 TemplateDeclaration *td = sa->isTemplateDeclaration(); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3784 if (td && !td->semanticRun && td->literal) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3785 td->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3786 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3787 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3788 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3789 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3790 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3791 //printf("1: tiargs->data[%d] = %p\n", j, tiargs->data[j]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3792 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3793 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3794 printf("-TemplateInstance::semanticTiargs('%s', this=%p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3795 for (size_t j = 0; j < tiargs->dim; j++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3796 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3797 Object *o = (Object *)tiargs->data[j]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3798 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3799 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3800 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3801 Tuple *va = isTuple(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3802 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3803 printf("\ttiargs[%d] = ta %p, ea %p, sa %p, va %p\n", j, ta, ea, sa, va); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3804 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3805 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3806 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3807 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3808 /********************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3809 * Find template declaration corresponding to template instance. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3810 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3811 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3812 TemplateDeclaration *TemplateInstance::findTemplateDeclaration(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3813 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3814 //printf("TemplateInstance::findTemplateDeclaration() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3815 if (!tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3816 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3817 /* Given: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3818 * foo!( ... ) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3819 * figure out which TemplateDeclaration foo refers to. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3820 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3821 Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3822 Dsymbol *scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3823 Identifier *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3824 int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3825 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3826 id = name; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3827 s = sc->search(loc, id, &scopesym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3828 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3829 { error("identifier '%s' is not defined", id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3830 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3831 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3832 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3833 printf("It's an instance of '%s' kind '%s'\n", s->toChars(), s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3834 if (s->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3835 printf("s->parent = '%s'\n", s->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3836 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3837 withsym = scopesym->isWithScopeSymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3838 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3839 /* We might have found an alias within a template when |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3840 * we really want the template. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3841 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3842 TemplateInstance *ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3843 if (s->parent && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3844 (ti = s->parent->isTemplateInstance()) != NULL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3845 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3846 if ( |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3847 (ti->name == id || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3848 ti->toAlias()->ident == id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3849 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3850 ti->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3851 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3852 /* This is so that one can refer to the enclosing |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3853 * template, even if it has the same name as a member |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3854 * of the template, if it has a !(arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3855 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3856 tempdecl = ti->tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3857 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3858 tempdecl = tempdecl->overroot; // then get the start |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3859 s = tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3860 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3861 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3862 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3863 s = s->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3864 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3865 /* It should be a TemplateDeclaration, not some other symbol |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3866 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3867 tempdecl = s->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3868 if (!tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3869 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3870 if (!s->parent && global.errors) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3871 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3872 if (!s->parent && s->getType()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3873 { Dsymbol *s2 = s->getType()->toDsymbol(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3874 if (!s2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3875 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3876 error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3877 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3878 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3879 s = s2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3880 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3881 #ifdef DEBUG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3882 //if (!s->parent) printf("s = %s %s\n", s->kind(), s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3883 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3884 //assert(s->parent); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3885 TemplateInstance *ti = s->parent ? s->parent->isTemplateInstance() : NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3886 if (ti && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3887 (ti->name == id || |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3888 ti->toAlias()->ident == id) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3889 && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3890 ti->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3891 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3892 /* This is so that one can refer to the enclosing |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3893 * template, even if it has the same name as a member |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3894 * of the template, if it has a !(arguments) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3895 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3896 tempdecl = ti->tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3897 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3898 tempdecl = tempdecl->overroot; // then get the start |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3899 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3900 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3901 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3902 error("%s is not a template declaration, it is a %s", id->toChars(), s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3903 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3904 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3905 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3906 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3907 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3908 assert(tempdecl->isTemplateDeclaration()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3909 return tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3910 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3911 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3912 TemplateDeclaration *TemplateInstance::findBestMatch(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3913 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3914 /* Since there can be multiple TemplateDeclaration's with the same |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3915 * name, look for the best match. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3916 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3917 TemplateDeclaration *td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3918 TemplateDeclaration *td_best = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3919 MATCH m_best = MATCHnomatch; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3920 Objects dedtypes; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3921 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3922 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3923 printf("TemplateInstance::findBestMatch()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3924 #endif |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3925 // First look for forward references |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3926 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3927 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3928 if (!td->semanticRun) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3929 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3930 if (td->scope) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3931 { // Try to fix forward reference |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3932 td->semantic(td->scope); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3933 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3934 if (!td->semanticRun) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3935 { |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3936 error("%s forward references template declaration %s\n", toChars(), td->toChars()); |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3937 return NULL; |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3938 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3939 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3940 } |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3941 |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3942 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3943 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3944 MATCH m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3945 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3946 //if (tiargs->dim) printf("2: tiargs->dim = %d, data[0] = %p\n", tiargs->dim, tiargs->data[0]); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3947 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3948 // If more arguments than parameters, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3949 // then this is no match. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3950 if (td->parameters->dim < tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3951 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3952 if (!td->isVariadic()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3953 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3954 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3955 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3956 dedtypes.setDim(td->parameters->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3957 dedtypes.zero(); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
3958 assert(td->semanticRun); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3959 m = td->matchWithInstance(this, &dedtypes, 0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3960 //printf("matchWithInstance = %d\n", m); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3961 if (!m) // no match at all |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3962 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3963 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3964 if (m < m_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3965 goto Ltd_best; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3966 if (m > m_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3967 goto Ltd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3968 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3969 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3970 // Disambiguate by picking the most specialized TemplateDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3971 MATCH c1 = td->leastAsSpecialized(td_best); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3972 MATCH c2 = td_best->leastAsSpecialized(td); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3973 //printf("c1 = %d, c2 = %d\n", c1, c2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3974 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3975 if (c1 > c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3976 goto Ltd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3977 else if (c1 < c2) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3978 goto Ltd_best; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3979 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3980 goto Lambig; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3981 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3982 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3983 Lambig: // td_best and td are ambiguous |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3984 td_ambig = td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3985 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3986 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3987 Ltd_best: // td_best is the best match so far |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3988 td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3989 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3990 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3991 Ltd: // td is the new best match |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3992 td_ambig = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3993 td_best = td; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3994 m_best = m; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3995 tdtypes.setDim(dedtypes.dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3996 memcpy(tdtypes.data, dedtypes.data, tdtypes.dim * sizeof(void *)); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3997 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3998 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
3999 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4000 if (!td_best) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4001 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4002 if (tempdecl && !tempdecl->overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4003 // Only one template, so we can give better error message |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4004 error("%s does not match template declaration %s", toChars(), tempdecl->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4005 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4006 error("%s does not match any template declaration", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4007 return NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4008 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4009 if (td_ambig) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4010 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4011 error("%s matches more than one template declaration, %s and %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4012 toChars(), td_best->toChars(), td_ambig->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4013 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4014 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4015 /* The best match is td_best |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4016 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4017 tempdecl = td_best; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4018 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4019 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4020 /* Cast any value arguments to be same type as value parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4021 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4022 for (size_t i = 0; i < tiargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4023 { Object *o = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4024 Expression *ea = isExpression(o); // value argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4025 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4026 assert(tp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4027 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4028 if (tvp) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4029 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4030 assert(ea); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4031 ea = ea->castTo(tvp->valType); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4032 ea = ea->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4033 tiargs->data[i] = (Object *)ea; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4034 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4035 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4036 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4037 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4038 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4039 printf("\tIt's a match with template declaration '%s'\n", tempdecl->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4040 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4041 return tempdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4042 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4043 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4044 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4045 /***************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4046 * Determines if a TemplateInstance will need a nested |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4047 * generation of the TemplateDeclaration. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4048 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4049 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4050 int TemplateInstance::hasNestedArgs(Objects *args) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4051 { int nested = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4052 //printf("TemplateInstance::hasNestedArgs('%s')\n", tempdecl->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4053 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4054 /* A nested instance happens when an argument references a local |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4055 * symbol that is on the stack. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4056 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4057 for (size_t i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4058 { Object *o = (Object *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4059 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4060 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4061 Tuple *va = isTuple(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4062 if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4063 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4064 if (ea->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4065 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4066 sa = ((VarExp *)ea)->var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4067 goto Lsa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4068 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4069 if (ea->op == TOKfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4070 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4071 sa = ((FuncExp *)ea)->fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4072 goto Lsa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4073 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4074 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4075 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4076 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4077 Lsa: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4078 Declaration *d = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4079 TemplateDeclaration *td = sa->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4080 if (td && td->literal) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4081 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4082 goto L2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4083 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4084 d = sa->isDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4085 if (d && !d->isDataseg() && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4086 #if DMDV2 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4087 !(d->storage_class & STCmanifest) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4088 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4089 (!d->isFuncDeclaration() || d->isFuncDeclaration()->isNested()) && |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4090 !isTemplateMixin()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4091 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4092 L2: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4093 // if module level template |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4094 if (tempdecl->toParent()->isModule()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4095 { Dsymbol *dparent = sa->toParent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4096 if (!isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4097 isnested = dparent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4098 else if (isnested != dparent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4099 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4100 /* Select the more deeply nested of the two. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4101 * Error if one is not nested inside the other. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4102 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4103 for (Dsymbol *p = isnested; p; p = p->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4104 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4105 if (p == dparent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4106 goto L1; // isnested is most nested |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4107 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4108 for (Dsymbol *p = dparent; p; p = p->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4109 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4110 if (p == isnested) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4111 { isnested = dparent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4112 goto L1; // dparent is most nested |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4113 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4114 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4115 error("%s is nested in both %s and %s", |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4116 toChars(), isnested->toChars(), dparent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4117 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4118 L1: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4119 //printf("\tnested inside %s\n", isnested->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4120 nested |= 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4121 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4122 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4123 error("cannot use local '%s' as parameter to non-global template %s", d->toChars(), tempdecl->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4124 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4125 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4126 else if (va) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4127 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4128 nested |= hasNestedArgs(&va->objects); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4129 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4130 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4131 return nested; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4132 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4133 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4134 /**************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4135 * This instance needs an identifier for name mangling purposes. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4136 * Create one by taking the template declaration name and adding |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4137 * the type signature for it. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4138 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4139 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4140 Identifier *TemplateInstance::genIdent() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4141 { OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4142 char *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4143 Objects *args; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4144 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4145 //printf("TemplateInstance::genIdent('%s')\n", tempdecl->ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4146 id = tempdecl->ident->toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4147 buf.printf("__T%zu%s", strlen(id), id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4148 args = tiargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4149 for (int i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4150 { Object *o = (Object *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4151 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4152 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4153 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4154 Tuple *va = isTuple(o); |
1577
e4f7b5d9c68a
DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents:
1526
diff
changeset
|
4155 //printf("\to [%d] %p ta %p ea %p sa %p va %p\n", i, o, ta, ea, sa, va); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4156 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4157 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4158 buf.writeByte('T'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4159 if (ta->deco) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4160 buf.writestring(ta->deco); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4161 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4162 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4163 #ifdef DEBUG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4164 printf("ta = %d, %s\n", ta->ty, ta->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4165 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4166 assert(global.errors); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4167 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4168 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4169 else if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4170 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4171 Lea: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4172 sinteger_t v; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4173 real_t r; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4174 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4175 ea = ea->optimize(WANTvalue | WANTinterpret); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4176 if (ea->op == TOKvar) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4177 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4178 sa = ((VarExp *)ea)->var; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4179 ea = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4180 goto Lsa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4181 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4182 if (ea->op == TOKfunction) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4183 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4184 sa = ((FuncExp *)ea)->fd; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4185 ea = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4186 goto Lsa; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4187 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4188 buf.writeByte('V'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4189 if (ea->op == TOKtuple) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4190 { ea->error("tuple is not a valid template value argument"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4191 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4192 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4193 #if 1 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4194 /* Use deco that matches what it would be for a function parameter |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4195 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4196 buf.writestring(ea->type->deco); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4197 #else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4198 // Use type of parameter, not type of argument |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4199 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4200 assert(tp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4201 TemplateValueParameter *tvp = tp->isTemplateValueParameter(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4202 assert(tvp); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4203 buf.writestring(tvp->valType->deco); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4204 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4205 ea->toMangleBuffer(&buf); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4206 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4207 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4208 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4209 Lsa: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4210 buf.writeByte('S'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4211 Declaration *d = sa->isDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4212 if (d && (!d->type || !d->type->deco)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4213 { error("forward reference of %s", d->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4214 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4215 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4216 #if 0 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4217 VarDeclaration *v = sa->isVarDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4218 if (v && v->storage_class & STCmanifest) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4219 { ExpInitializer *ei = v->init->isExpInitializer(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4220 if (ei) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4221 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4222 ea = ei->exp; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4223 goto Lea; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4224 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4225 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4226 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4227 const char *p = sa->mangle(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4228 buf.printf("%zu%s", strlen(p), p); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4229 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4230 else if (va) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4231 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4232 assert(i + 1 == args->dim); // must be last one |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4233 args = &va->objects; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4234 i = -1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4235 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4236 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4237 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4238 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4239 buf.writeByte('Z'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4240 id = buf.toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4241 buf.data = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4242 //printf("\tgenIdent = %s\n", id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4243 return new Identifier(id, TOKidentifier); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4244 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4245 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4246 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4247 /**************************************************** |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4248 * Declare parameters of template instance, initialize them with the |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4249 * template instance arguments. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4250 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4251 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4252 void TemplateInstance::declareParameters(Scope *sc) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4253 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4254 //printf("TemplateInstance::declareParameters()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4255 for (int i = 0; i < tdtypes.dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4256 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4257 TemplateParameter *tp = (TemplateParameter *)tempdecl->parameters->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4258 //Object *o = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4259 Object *o = (Object *)tdtypes.data[i]; // initializer for tp |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4260 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4261 //printf("\ttdtypes[%d] = %p\n", i, o); |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4262 tempdecl->declareParameter(sc, tp, o); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4263 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4264 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4265 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4266 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4267 void TemplateInstance::semantic2(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4268 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4269 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4270 if (semanticRun >= 2) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4271 return; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4272 semanticRun = 2; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4273 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4274 printf("+TemplateInstance::semantic2('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4275 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4276 if (!errors && members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4277 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4278 sc = tempdecl->scope; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4279 assert(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4280 sc = sc->push(argsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4281 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4282 sc->tinst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4283 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4284 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4285 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4286 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4287 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4288 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4289 s->semantic2(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4290 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4291 sc = sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4292 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4293 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4294 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4295 printf("-TemplateInstance::semantic2('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4296 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4297 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4298 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4299 void TemplateInstance::semantic3(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4300 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4301 #if LOG |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4302 printf("TemplateInstance::semantic3('%s'), semanticRun = %d\n", toChars(), semanticRun); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4303 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4304 //if (toChars()[0] == 'D') *(char*)0=0; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4305 if (semanticRun >= 3) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4306 return; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4307 semanticRun = 3; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4308 if (!errors && members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4309 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4310 sc = tempdecl->scope; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4311 sc = sc->push(argsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4312 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4313 sc->tinst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4314 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4315 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4316 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4317 s->semantic3(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4318 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4319 sc = sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4320 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4321 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4322 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4323 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4324 #if IN_DMD |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4325 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4326 void TemplateInstance::printInstantiationTrace() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4327 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4328 if (global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4329 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4330 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4331 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4332 void TemplateInstance::toObjFile(int multiobj) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4333 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4334 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4335 printf("TemplateInstance::toObjFile('%s', this = %p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4336 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4337 if (!errors && members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4338 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4339 if (multiobj) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4340 // Append to list of object files to be written later |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4341 obj_append(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4342 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4343 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4344 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4345 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4346 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4347 s->toObjFile(multiobj); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4348 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4349 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4350 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4351 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4352 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4353 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4354 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4355 void TemplateInstance::inlineScan() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4356 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4357 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4358 printf("TemplateInstance::inlineScan('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4359 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4360 if (!errors && members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4361 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4362 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4363 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4364 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4365 s->inlineScan(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4366 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4367 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4368 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4369 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4370 void TemplateInstance::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4371 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4372 int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4373 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4374 Identifier *id = name; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4375 buf->writestring(id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4376 buf->writestring("!("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4377 if (nest) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4378 buf->writestring("..."); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4379 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4380 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4381 nest++; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4382 Objects *args = tiargs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4383 for (i = 0; i < args->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4384 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4385 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4386 buf->writeByte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4387 Object *oarg = (Object *)args->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4388 ObjectToCBuffer(buf, hgs, oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4389 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4390 nest--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4391 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4392 buf->writeByte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4393 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4394 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4395 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4396 Dsymbol *TemplateInstance::toAlias() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4397 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4398 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4399 printf("TemplateInstance::toAlias()\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4400 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4401 if (!inst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4402 { error("cannot resolve forward reference"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4403 return this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4404 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4405 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4406 if (inst != this) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4407 return inst->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4408 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4409 if (aliasdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4410 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4411 return aliasdecl->toAlias(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4412 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4413 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4414 return inst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4415 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4416 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4417 AliasDeclaration *TemplateInstance::isAliasDeclaration() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4418 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4419 return aliasdecl; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4420 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4421 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4422 const char *TemplateInstance::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4423 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4424 return "template instance"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4425 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4426 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4427 int TemplateInstance::oneMember(Dsymbol **ps) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4428 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4429 *ps = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4430 return TRUE; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4431 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4432 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4433 char *TemplateInstance::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4434 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4435 OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4436 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4437 char *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4438 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4439 toCBuffer(&buf, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4440 s = buf.toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4441 buf.data = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4442 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4443 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4444 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4445 #if IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4446 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4447 void TemplateInstance::printInstantiationTrace() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4448 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4449 if(global.gag) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4450 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4451 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4452 const int max_shown = 6; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4453 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4454 // determine instantiation depth |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4455 int n_instantiations = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4456 TemplateInstance* cur = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4457 while(cur = cur->tinst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4458 ++n_instantiations; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4459 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4460 // show full trace only if it's short or verbose is on |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4461 if(n_instantiations <= max_shown || global.params.verbose) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4462 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4463 cur = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4464 while(cur) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4465 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4466 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4467 cur = cur->tinst; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4468 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4469 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4470 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4471 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4472 cur = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4473 size_t i = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4474 for(; i < max_shown/2; ++i, cur = cur->tinst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4475 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4476 fprintf(stdmsg," ... (%d instantiations, -v to show) ...\n", n_instantiations - max_shown); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4477 for(; i < n_instantiations - max_shown + max_shown/2; ++i, cur = cur->tinst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4478 {} |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4479 for(; i < n_instantiations; ++i, cur = cur->tinst) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4480 fprintf(stdmsg," instantiatied in %s: %s\n", cur->loc.toChars(), cur->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4481 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4482 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4483 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4484 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4485 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4486 /* ======================== TemplateMixin ================================ */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4487 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4488 TemplateMixin::TemplateMixin(Loc loc, Identifier *ident, Type *tqual, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4489 Array *idents, Objects *tiargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4490 : TemplateInstance(loc, (Identifier *)idents->data[idents->dim - 1]) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4491 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4492 //printf("TemplateMixin(ident = '%s')\n", ident ? ident->toChars() : ""); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4493 this->ident = ident; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4494 this->tqual = tqual; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4495 this->idents = idents; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4496 this->tiargs = tiargs ? tiargs : new Objects(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4497 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4498 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4499 Dsymbol *TemplateMixin::syntaxCopy(Dsymbol *s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4500 { TemplateMixin *tm; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4501 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4502 Array *ids = new Array(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4503 ids->setDim(idents->dim); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4504 for (int i = 0; i < idents->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4505 { // Matches TypeQualified::syntaxCopyHelper() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4506 Identifier *id = (Identifier *)idents->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4507 if (id->dyncast() == DYNCAST_DSYMBOL) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4508 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4509 TemplateInstance *ti = (TemplateInstance *)id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4510 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4511 ti = (TemplateInstance *)ti->syntaxCopy(NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4512 id = (Identifier *)ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4513 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4514 ids->data[i] = id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4515 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4516 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4517 tm = new TemplateMixin(loc, ident, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4518 (Type *)(tqual ? tqual->syntaxCopy() : NULL), |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4519 ids, tiargs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4520 TemplateInstance::syntaxCopy(tm); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4521 return tm; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4522 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4523 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4524 void TemplateMixin::semantic(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4525 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4526 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4527 printf("+TemplateMixin::semantic('%s', this=%p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4528 fflush(stdout); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4529 #endif |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4530 if (semanticRun && |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4531 // This for when a class/struct contains mixin members, and |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4532 // is done over because of forward references |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4533 (!parent || !toParent()->isAggregateDeclaration())) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4534 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4535 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4536 printf("\tsemantic done\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4537 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4538 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4539 } |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4540 if (!semanticRun) |
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4541 semanticRun = 1; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4542 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4543 printf("\tdo semantic\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4544 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4545 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4546 #if !IN_LLVM |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4547 // dont know what this is |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4548 util_progress(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4549 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4550 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4551 Scope *scx = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4552 if (scope) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4553 { sc = scope; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4554 scx = scope; // save so we don't make redundant copies |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4555 scope = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4556 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4557 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4558 // Follow qualifications to find the TemplateDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4559 if (!tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4560 { Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4561 int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4562 Identifier *id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4563 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4564 if (tqual) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4565 { s = tqual->toDsymbol(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4566 i = 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4567 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4568 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4569 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4570 i = 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4571 id = (Identifier *)idents->data[0]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4572 switch (id->dyncast()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4573 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4574 case DYNCAST_IDENTIFIER: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4575 s = sc->search(loc, id, NULL); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4576 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4577 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4578 case DYNCAST_DSYMBOL: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4579 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4580 TemplateInstance *ti = (TemplateInstance *)id; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4581 ti->semantic(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4582 s = ti; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4583 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4584 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4585 default: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4586 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4587 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4588 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4589 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4590 for (; i < idents->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4591 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4592 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4593 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4594 id = (Identifier *)idents->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4595 s = s->searchX(loc, sc, id); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4596 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4597 if (!s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4598 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4599 error("is not defined"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4600 inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4601 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4602 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4603 tempdecl = s->toAlias()->isTemplateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4604 if (!tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4605 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4606 error("%s isn't a template", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4607 inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4608 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4609 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4610 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4611 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4612 // Look for forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4613 assert(tempdecl); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4614 for (TemplateDeclaration *td = tempdecl; td; td = td->overnext) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4615 { |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4616 if (!td->semanticRun) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4617 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4618 /* Cannot handle forward references if mixin is a struct member, |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4619 * because addField must happen during struct's semantic, not |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4620 * during the mixin semantic. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4621 * runDeferred will re-run mixin's semantic outside of the struct's |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4622 * semantic. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4623 */ |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4624 semanticRun = 0; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4625 AggregateDeclaration *ad = toParent()->isAggregateDeclaration(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4626 if (ad) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4627 ad->sizeok = 2; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4628 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4629 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4630 // Forward reference |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4631 //printf("forward reference - deferring\n"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4632 scope = scx ? scx : new Scope(*sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4633 scope->setNoFree(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4634 scope->module->addDeferredSemantic(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4635 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4636 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4637 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4638 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4639 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4640 // Run semantic on each argument, place results in tiargs[] |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4641 semanticTiargs(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4642 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4643 tempdecl = findBestMatch(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4644 if (!tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4645 { inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4646 return; // error recovery |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4647 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4648 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4649 if (!ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4650 ident = genIdent(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4651 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4652 inst = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4653 parent = sc->parent; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4654 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4655 /* Detect recursive mixin instantiations. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4656 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4657 for (Dsymbol *s = parent; s; s = s->parent) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4658 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4659 //printf("\ts = '%s'\n", s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4660 TemplateMixin *tm = s->isTemplateMixin(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4661 if (!tm || tempdecl != tm->tempdecl) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4662 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4663 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4664 /* Different argument list lengths happen with variadic args |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4665 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4666 if (tiargs->dim != tm->tiargs->dim) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4667 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4668 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4669 for (int i = 0; i < tiargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4670 { Object *o = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4671 Type *ta = isType(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4672 Expression *ea = isExpression(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4673 Dsymbol *sa = isDsymbol(o); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4674 Object *tmo = (Object *)tm->tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4675 if (ta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4676 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4677 Type *tmta = isType(tmo); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4678 if (!tmta) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4679 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4680 if (!ta->equals(tmta)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4681 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4682 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4683 else if (ea) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4684 { Expression *tme = isExpression(tmo); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4685 if (!tme || !ea->equals(tme)) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4686 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4687 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4688 else if (sa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4689 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4690 Dsymbol *tmsa = isDsymbol(tmo); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4691 if (sa != tmsa) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4692 goto Lcontinue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4693 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4694 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4695 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4696 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4697 error("recursive mixin instantiation"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4698 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4699 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4700 Lcontinue: |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4701 continue; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4702 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4703 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4704 // Copy the syntax trees from the TemplateDeclaration |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4705 members = Dsymbol::arraySyntaxCopy(tempdecl->members); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4706 if (!members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4707 return; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4708 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4709 symtab = new DsymbolTable(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4710 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4711 for (Scope *sce = sc; 1; sce = sce->enclosing) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4712 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4713 ScopeDsymbol *sds = (ScopeDsymbol *)sce->scopesym; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4714 if (sds) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4715 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4716 sds->importScope(this, PROTpublic); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4717 break; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4718 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4719 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4720 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4721 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4722 printf("\tcreate scope for template parameters '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4723 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4724 Scope *scy = sc; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4725 scy = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4726 scy->parent = this; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4727 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4728 argsym = new ScopeDsymbol(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4729 argsym->parent = scy->parent; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4730 Scope *argscope = scy->push(argsym); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4731 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4732 unsigned errorsave = global.errors; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4733 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4734 // Declare each template parameter as an alias for the argument type |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4735 declareParameters(argscope); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4736 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4737 // Add members to enclosing scope, as well as this scope |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4738 for (unsigned i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4739 { Dsymbol *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4740 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4741 s = (Dsymbol *)members->data[i]; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4742 s->addMember(argscope, this, i); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4743 //sc->insert(s); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4744 //printf("sc->parent = %p, sc->scopesym = %p\n", sc->parent, sc->scopesym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4745 //printf("s->parent = %s\n", s->parent->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4746 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4747 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4748 // Do semantic() analysis on template instance members |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4749 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4750 printf("\tdo semantic() on template instance members '%s'\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4751 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4752 Scope *sc2; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4753 sc2 = argscope->push(this); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4754 sc2->offset = sc->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4755 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4756 static int nest; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4757 //printf("%d\n", nest); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4758 if (++nest > 500) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4759 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4760 global.gag = 0; // ensure error message gets printed |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4761 error("recursive expansion"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4762 fatal(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4763 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4764 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4765 for (int i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4766 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4767 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4768 s->semantic(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4769 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4770 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4771 nest--; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4772 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4773 sc->offset = sc2->offset; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4774 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4775 /* The problem is when to parse the initializer for a variable. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4776 * Perhaps VarDeclaration::semantic() should do it like it does |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4777 * for initializers inside a function. |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4778 */ |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4779 // if (sc->parent->isFuncDeclaration()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4780 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4781 semantic2(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4782 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4783 if (sc->func) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4784 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4785 semantic3(sc2); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4786 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4787 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4788 // Give additional context info if error occurred during instantiation |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4789 if (global.errors != errorsave) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4790 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4791 error("error instantiating"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4792 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4793 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4794 sc2->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4795 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4796 argscope->pop(); |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4797 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4798 // if (!isAnonymous()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4799 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4800 scy->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4801 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4802 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4803 printf("-TemplateMixin::semantic('%s', this=%p)\n", toChars(), this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4804 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4805 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4806 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4807 void TemplateMixin::semantic2(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4808 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4809 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4810 if (semanticRun >= 2) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4811 return; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4812 semanticRun = 2; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4813 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4814 printf("+TemplateMixin::semantic2('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4815 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4816 if (members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4817 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4818 assert(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4819 sc = sc->push(argsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4820 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4821 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4822 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4823 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4824 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4825 printf("\tmember '%s', kind = '%s'\n", s->toChars(), s->kind()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4826 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4827 s->semantic2(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4828 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4829 sc = sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4830 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4831 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4832 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4833 printf("-TemplateMixin::semantic2('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4834 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4835 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4836 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4837 void TemplateMixin::semantic3(Scope *sc) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4838 { int i; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4839 |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4840 if (semanticRun >= 3) |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4841 return; |
1526
54b3c1394d62
Merged dmdfe 2.031.
Robert Clipsham <robert@octarineparrot.com>
parents:
1452
diff
changeset
|
4842 semanticRun = 3; |
1452
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4843 #if LOG |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4844 printf("TemplateMixin::semantic3('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4845 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4846 if (members) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4847 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4848 sc = sc->push(argsym); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4849 sc = sc->push(this); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4850 for (i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4851 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4852 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4853 s->semantic3(sc); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4854 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4855 sc = sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4856 sc->pop(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4857 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4858 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4859 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4860 void TemplateMixin::inlineScan() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4861 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4862 TemplateInstance::inlineScan(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4863 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4864 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4865 const char *TemplateMixin::kind() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4866 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4867 return "mixin"; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4868 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4869 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4870 int TemplateMixin::oneMember(Dsymbol **ps) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4871 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4872 return Dsymbol::oneMember(ps); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4873 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4874 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4875 int TemplateMixin::hasPointers() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4876 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4877 //printf("TemplateMixin::hasPointers() %s\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4878 for (size_t i = 0; i < members->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4879 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4880 Dsymbol *s = (Dsymbol *)members->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4881 //printf(" s = %s %s\n", s->kind(), s->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4882 if (s->hasPointers()) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4883 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4884 return 1; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4885 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4886 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4887 return 0; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4888 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4889 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4890 char *TemplateMixin::toChars() |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4891 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4892 OutBuffer buf; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4893 HdrGenState hgs; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4894 char *s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4895 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4896 TemplateInstance::toCBuffer(&buf, &hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4897 s = buf.toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4898 buf.data = NULL; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4899 return s; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4900 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4901 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4902 void TemplateMixin::toCBuffer(OutBuffer *buf, HdrGenState *hgs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4903 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4904 buf->writestring("mixin "); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4905 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4906 for (int i = 0; i < idents->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4907 { Identifier *id = (Identifier *)idents->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4908 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4909 if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4910 buf->writeByte('.'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4911 buf->writestring(id->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4912 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4913 buf->writestring("!("); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4914 if (tiargs) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4915 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4916 for (int i = 0; i < tiargs->dim; i++) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4917 { if (i) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4918 buf->writebyte(','); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4919 Object *oarg = (Object *)tiargs->data[i]; |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4920 Type *t = isType(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4921 Expression *e = isExpression(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4922 Dsymbol *s = isDsymbol(oarg); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4923 if (t) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4924 t->toCBuffer(buf, NULL, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4925 else if (e) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4926 e->toCBuffer(buf, hgs); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4927 else if (s) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4928 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4929 char *p = s->ident ? s->ident->toChars() : s->toChars(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4930 buf->writestring(p); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4931 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4932 else if (!oarg) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4933 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4934 buf->writestring("NULL"); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4935 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4936 else |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4937 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4938 assert(0); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4939 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4940 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4941 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4942 buf->writebyte(')'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4943 if (ident) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4944 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4945 buf->writebyte(' '); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4946 buf->writestring(ident->toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4947 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4948 buf->writebyte(';'); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4949 buf->writenl(); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4950 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4951 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4952 |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4953 #if IN_DMD |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4954 void TemplateMixin::toObjFile(int multiobj) |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4955 { |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4956 //printf("TemplateMixin::toObjFile('%s')\n", toChars()); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4957 TemplateInstance::toObjFile(multiobj); |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4958 } |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4959 #endif |
638d16625da2
LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
953
diff
changeset
|
4960 |