annotate dmd/template.h @ 270:d9d5d59873d8 trunk

[svn r291] Fixed a bunch of the old Phobos tests to work with Tango. Branch statements now emit a new block after it. Fixed the _adSort runtime function had a bad signature. Added a missing dot prefix on compiler generated string tables for string switch. Fixed, PTRSIZE seems like it was wrong on 64bit, now it definitely gets set properly.
author lindquist
date Mon, 16 Jun 2008 16:01:19 +0200
parents 5acec6b2eef8
children 571959608194
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
2 // Compiler implementation of the D programming language
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
3 // Copyright (c) 1999-2006 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
11 #ifndef DMD_TEMPLATE_H
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
12 #define DMD_TEMPLATE_H
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
13
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
14 #ifdef __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
15 #pragma once
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
16 #endif /* __DMC__ */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
17
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
18 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
19 #include "arraytypes.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
20 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
21 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
22
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
23
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
24 struct OutBuffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
25 struct Identifier;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
26 struct TemplateInstance;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
27 struct TemplateParameter;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
28 struct TemplateTypeParameter;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
29 struct TemplateValueParameter;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
30 struct TemplateAliasParameter;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
31 struct TemplateTupleParameter;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
32 struct Type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
33 struct TypeTypeof;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
34 struct Scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
35 struct Expression;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
36 struct AliasDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
37 struct FuncDeclaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
38 struct HdrGenState;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
39 enum MATCH;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
40
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
41 struct Tuple : Object
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
42 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
43 Objects objects;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
44
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
45 int dyncast() { return DYNCAST_TUPLE; } // kludge for template.isType()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
46 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
47
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
48
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
49 struct TemplateDeclaration : ScopeDsymbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
50 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
51 TemplateParameters *parameters; // array of TemplateParameter's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
52
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
53 TemplateParameters *origParameters; // originals for Ddoc
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
54
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
55 Array instances; // array of TemplateInstance's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
56
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
57 TemplateDeclaration *overnext; // next overloaded TemplateDeclaration
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
58 TemplateDeclaration *overroot; // first in overnext list
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
59
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
60 Scope *scope;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
61 Dsymbol *onemember; // if !=NULL then one member of this template
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
62
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
63 TemplateDeclaration(Loc loc, Identifier *id, TemplateParameters *parameters, Array *decldefs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
64 Dsymbol *syntaxCopy(Dsymbol *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
65 void semantic(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
66 int overloadInsert(Dsymbol *s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
67 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
68 char *kind();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
69 char *toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
70
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
71 void emitComment(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
72 // void toDocBuffer(OutBuffer *buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
73
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
74 MATCH matchWithInstance(TemplateInstance *ti, Objects *atypes, int flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
75 int leastAsSpecialized(TemplateDeclaration *td2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
76
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
77 MATCH deduceFunctionTemplateMatch(Objects *targsi, Expressions *fargs, Objects *dedargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
78 FuncDeclaration *deduceFunctionTemplate(Scope *sc, Loc loc, Objects *targsi, Expressions *fargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
79 void declareParameter(Scope *sc, TemplateParameter *tp, Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
80
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
81 TemplateDeclaration *isTemplateDeclaration() { return this; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
82
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
83 TemplateTupleParameter *isVariadic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
84 int isOverloadable();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
85 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
86
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
87 struct TemplateParameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
88 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
89 /* For type-parameter:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
90 * template Foo(ident) // specType is set to NULL
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
91 * template Foo(ident : specType)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
92 * For value-parameter:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
93 * template Foo(valType ident) // specValue is set to NULL
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
94 * template Foo(valType ident : specValue)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
95 * For alias-parameter:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
96 * template Foo(alias ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
97 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
98
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
99 Loc loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
100 Identifier *ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
102 Declaration *sparam;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
104 TemplateParameter(Loc loc, Identifier *ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
105
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
106 virtual TemplateTypeParameter *isTemplateTypeParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
107 virtual TemplateValueParameter *isTemplateValueParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
108 virtual TemplateAliasParameter *isTemplateAliasParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
109 virtual TemplateTupleParameter *isTemplateTupleParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
111 virtual TemplateParameter *syntaxCopy() = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
112 virtual void declareParameter(Scope *sc) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
113 virtual void semantic(Scope *) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
114 virtual void print(Object *oarg, Object *oded) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
115 virtual void toCBuffer(OutBuffer *buf, HdrGenState *hgs) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
116 virtual Object *specialization() = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
117 virtual Object *defaultArg(Scope *sc) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
118
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
119 /* If TemplateParameter's match as far as overloading goes.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
120 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
121 virtual int overloadMatch(TemplateParameter *) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
122
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
123 /* Match actual argument against parameter.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
124 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
125 virtual MATCH matchArg(Scope *sc, Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
126
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
127 /* Create dummy argument based on parameter.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
128 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
129 virtual void *dummyArg() = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
130 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
132 struct TemplateTypeParameter : TemplateParameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
133 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
134 /* Syntax:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
135 * ident : specType = defaultType
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
136 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
137 Type *specType; // type parameter: if !=NULL, this is the type specialization
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
138 Type *defaultType;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
140 TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType, Type *defaultType);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
141
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
142 TemplateTypeParameter *isTemplateTypeParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
143 TemplateParameter *syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
144 void declareParameter(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
145 void semantic(Scope *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
146 void print(Object *oarg, Object *oded);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
147 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
148 Object *specialization();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
149 Object *defaultArg(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
150 int overloadMatch(TemplateParameter *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
151 MATCH matchArg(Scope *sc, Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
152 void *dummyArg();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
153 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
154
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
155 struct TemplateValueParameter : TemplateParameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
156 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
157 /* Syntax:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
158 * valType ident : specValue = defaultValue
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
159 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
161 Type *valType;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
162 Expression *specValue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
163 Expression *defaultValue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
164
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
165 static Expression *edummy;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
166
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
167 TemplateValueParameter(Loc loc, Identifier *ident, Type *valType, Expression *specValue, Expression *defaultValue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
168
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
169 TemplateValueParameter *isTemplateValueParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
170 TemplateParameter *syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
171 void declareParameter(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
172 void semantic(Scope *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
173 void print(Object *oarg, Object *oded);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
174 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
175 Object *specialization();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
176 Object *defaultArg(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
177 int overloadMatch(TemplateParameter *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
178 MATCH matchArg(Scope *sc, Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
179 void *dummyArg();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
180 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
181
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
182 struct TemplateAliasParameter : TemplateParameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
183 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
184 /* Syntax:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
185 * ident : specAlias = defaultAlias
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
186 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
188 Type *specAliasT;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
189 Dsymbol *specAlias;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
191 Type *defaultAlias;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
193 static Dsymbol *sdummy;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
195 TemplateAliasParameter(Loc loc, Identifier *ident, Type *specAliasT, Type *defaultAlias);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
196
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
197 TemplateAliasParameter *isTemplateAliasParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
198 TemplateParameter *syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
199 void declareParameter(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
200 void semantic(Scope *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
201 void print(Object *oarg, Object *oded);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
202 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
203 Object *specialization();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
204 Object *defaultArg(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
205 int overloadMatch(TemplateParameter *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
206 MATCH matchArg(Scope *sc, Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
207 void *dummyArg();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
208 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
210 struct TemplateTupleParameter : TemplateParameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
211 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
212 /* Syntax:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
213 * ident ...
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
214 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
216 TemplateTupleParameter(Loc loc, Identifier *ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
218 TemplateTupleParameter *isTemplateTupleParameter();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
219 TemplateParameter *syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
220 void declareParameter(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
221 void semantic(Scope *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
222 void print(Object *oarg, Object *oded);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
223 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
224 Object *specialization();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
225 Object *defaultArg(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
226 int overloadMatch(TemplateParameter *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
227 MATCH matchArg(Scope *sc, Objects *tiargs, int i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
228 void *dummyArg();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
229 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
231 struct TemplateInstance : ScopeDsymbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
232 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
233 /* Given:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
234 * foo!(args) =>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
235 * name = foo
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
236 * tiargs = args
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
237 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
238 Identifier *name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
239 //Array idents;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
240 Objects *tiargs; // Array of Types/Expressions of template
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
241 // instance arguments [int*, char, 10*10]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
242
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
243 Objects tdtypes; // Array of Types/Expressions corresponding
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
244 // to TemplateDeclaration.parameters
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
245 // [int, char, 100]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
247 TemplateDeclaration *tempdecl; // referenced by foo.bar.abc
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
248 TemplateInstance *inst; // refer to existing instance
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
249 ScopeDsymbol *argsym; // argument symbol table
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
250 AliasDeclaration *aliasdecl; // !=NULL if instance is an alias for its
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
251 // sole member
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
252 WithScopeSymbol *withsym; // if a member of a with statement
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
253 int semanticdone; // has semantic() been done?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
254 int nest; // for recursion detection
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
255 int havetempdecl; // 1 if used second constructor
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
256 Dsymbol *isnested; // if referencing local symbols, this is the context
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
257 int errors; // 1 if compiled with errors
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
258 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
259 /* On some targets, it is necessary to know whether a symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
260 will be emitted in the output or not before the symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
261 is used. This can be different from getModule(). */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
262 Module * objFileModule;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
263 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
265 TemplateInstance(Loc loc, Identifier *temp_id);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
266 TemplateInstance(Loc loc, TemplateDeclaration *tempdecl, Objects *tiargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
267 static Objects *arraySyntaxCopy(Objects *objs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
268 Dsymbol *syntaxCopy(Dsymbol *);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
269 void semantic(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
270 void semantic2(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
271 void semantic3(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
272 void inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
273 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
274 Dsymbol *toAlias(); // resolve real symbol
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
275 char *kind();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
276 int oneMember(Dsymbol **ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
277 char *toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
278 char *mangle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
280 void toObjFile(); // compile to .obj file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
282 // Internal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
283 static void semanticTiargs(Loc loc, Scope *sc, Objects *tiargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
284 void semanticTiargs(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
285 TemplateDeclaration *findTemplateDeclaration(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
286 TemplateDeclaration *findBestMatch(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
287 void declareParameters(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
288 int isNested(Objects *tiargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
289 Identifier *genIdent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
290
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
291 TemplateInstance *isTemplateInstance() { return this; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
292 AliasDeclaration *isAliasDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
293 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
294
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
295 struct TemplateMixin : TemplateInstance
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
296 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
297 Array *idents;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
298 Type *tqual;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
300 Scope *scope; // for forward referencing
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
301
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
302 TemplateMixin(Loc loc, Identifier *ident, Type *tqual, Array *idents, Objects *tiargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
303 Dsymbol *syntaxCopy(Dsymbol *s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
304 void semantic(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
305 void semantic2(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
306 void semantic3(Scope *sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
307 void inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
308 char *kind();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
309 int oneMember(Dsymbol **ps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
310 int hasPointers();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
311 char *toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
312 void toCBuffer(OutBuffer *buf, HdrGenState *hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
314 void toObjFile(); // compile to .obj file
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
315
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
316 TemplateMixin *isTemplateMixin() { return this; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
317 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
318
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
319 Expression *isExpression(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
320 Dsymbol *isDsymbol(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
321 Type *isType(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
322 Tuple *isTuple(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
323 Type *getType(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
324 Dsymbol *getDsymbol(Object *o);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
325
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
326 void ObjectToCBuffer(OutBuffer *buf, HdrGenState *hgs, Object *oarg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
327
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 130
diff changeset
328 #endif /* DMD_TEMPLATE_H */