annotate gcc/d/dmd/template.h @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 /* Compiler implementation of the D programming language
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 * written by Walter Bright
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 * http://www.digitalmars.com
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 * Distributed under the Boost Software License, Version 1.0.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 * http://www.boost.org/LICENSE_1_0.txt
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 * https://github.com/dlang/dmd/blob/master/src/dmd/template.h
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 #pragma once
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 #include "root/root.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 #include "arraytypes.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 #include "dsymbol.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 struct OutBuffer;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 class Identifier;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 class TemplateInstance;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 class TemplateParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 class TemplateTypeParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 class TemplateThisParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 class TemplateValueParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 class TemplateAliasParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 class TemplateTupleParameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 class Type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 class TypeQualified;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 class TypeTypeof;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 struct Scope;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 class Expression;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 class AliasDeclaration;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 class FuncDeclaration;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 class Parameter;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 enum MATCH;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 enum PASS;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 class Tuple : public RootObject
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 Objects objects;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 // kludge for template.isType()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 int dyncast() const { return DYNCAST_TUPLE; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 const char *toChars() { return objects.toChars(); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 struct TemplatePrevious
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 TemplatePrevious *prev;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 Scope *sc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 Objects *dedargs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 class TemplateDeclaration : public ScopeDsymbol
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 TemplateParameters *parameters; // array of TemplateParameter's
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 TemplateParameters *origParameters; // originals for Ddoc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 Expression *constraint;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 // Hash table to look up TemplateInstance's of this TemplateDeclaration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 void *instances;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 TemplateDeclaration *overnext; // next overloaded TemplateDeclaration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 TemplateDeclaration *overroot; // first in overnext list
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 FuncDeclaration *funcroot; // first function in unified overload list
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 Dsymbol *onemember; // if !=NULL then one member of this template
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 bool literal; // this template declaration is a literal
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 bool ismixin; // template declaration is only to be used as a mixin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 bool isstatic; // this is static template declaration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 Prot protection;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 TemplatePrevious *previous; // threaded list of previous instantiation attempts on stack
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 TemplateDeclaration(Loc loc, Identifier *id, TemplateParameters *parameters,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 Expression *constraint, Dsymbols *decldefs, bool ismixin = false, bool literal = false);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 Dsymbol *syntaxCopy(Dsymbol *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 void semantic(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 bool overloadInsert(Dsymbol *s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 bool hasStaticCtorOrDtor();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 const char *kind() const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 const char *toChars();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 Prot prot();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 bool evaluateConstraint(TemplateInstance *ti, Scope *sc, Scope *paramscope, Objects *dedtypes, FuncDeclaration *fd);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 MATCH matchWithInstance(Scope *sc, TemplateInstance *ti, Objects *atypes, Expressions *fargs, int flag);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 MATCH leastAsSpecialized(Scope *sc, TemplateDeclaration *td2, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 MATCH deduceFunctionTemplateMatch(TemplateInstance *ti, Scope *sc, FuncDeclaration *&fd, Type *tthis, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 RootObject *declareParameter(Scope *sc, TemplateParameter *tp, RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 FuncDeclaration *doHeaderInstantiation(TemplateInstance *ti, Scope *sc, FuncDeclaration *fd, Type *tthis, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 TemplateInstance *findExistingInstance(TemplateInstance *tithis, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 TemplateInstance *addInstance(TemplateInstance *ti);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 void removeInstance(TemplateInstance *handle);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 TemplateDeclaration *isTemplateDeclaration() { return this; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 TemplateTupleParameter *isVariadic();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 bool isOverloadable();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 /* For type-parameter:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 * template Foo(ident) // specType is set to NULL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 * template Foo(ident : specType)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 * For value-parameter:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 * template Foo(valType ident) // specValue is set to NULL
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 * template Foo(valType ident : specValue)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 * For alias-parameter:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 * template Foo(alias ident)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 * For this-parameter:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 * template Foo(this ident)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 class TemplateParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 Loc loc;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 Identifier *ident;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 /* True if this is a part of precedent parameter specialization pattern.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 * template A(T : X!TL, alias X, TL...) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 * // X and TL are dependent template parameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 *
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 * A dependent template parameter should return MATCHexact in matchArg()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 * to respect the match level of the corresponding precedent parameter.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 bool dependent;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 TemplateParameter(Loc loc, Identifier *ident);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 virtual TemplateTypeParameter *isTemplateTypeParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 virtual TemplateValueParameter *isTemplateValueParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 virtual TemplateAliasParameter *isTemplateAliasParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 virtual TemplateThisParameter *isTemplateThisParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 virtual TemplateTupleParameter *isTemplateTupleParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 virtual TemplateParameter *syntaxCopy() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 virtual bool declareParameter(Scope *sc) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 virtual bool semantic(Scope *sc, TemplateParameters *parameters) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 virtual void print(RootObject *oarg, RootObject *oded) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 virtual RootObject *specialization() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 virtual RootObject *defaultArg(Loc instLoc, Scope *sc) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 virtual bool hasDefaultArg() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 /* Match actual argument against parameter.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 virtual MATCH matchArg(Loc instLoc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 virtual MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 /* Create dummy argument based on parameter.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 virtual void *dummyArg() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 virtual void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 /* Syntax:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 * ident : specType = defaultType
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 class TemplateTypeParameter : public TemplateParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 using TemplateParameter::matchArg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 Type *specType; // type parameter: if !=NULL, this is the type specialization
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 Type *defaultType;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 static Type *tdummy;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 TemplateTypeParameter(Loc loc, Identifier *ident, Type *specType, Type *defaultType);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 TemplateTypeParameter *isTemplateTypeParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 TemplateParameter *syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 bool declareParameter(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 bool semantic(Scope *sc, TemplateParameters *parameters);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 void print(RootObject *oarg, RootObject *oded);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 RootObject *specialization();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 RootObject *defaultArg(Loc instLoc, Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 bool hasDefaultArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 void *dummyArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 /* Syntax:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 * this ident : specType = defaultType
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 class TemplateThisParameter : public TemplateTypeParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 TemplateThisParameter(Loc loc, Identifier *ident, Type *specType, Type *defaultType);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 TemplateThisParameter *isTemplateThisParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 TemplateParameter *syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 /* Syntax:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 * valType ident : specValue = defaultValue
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 class TemplateValueParameter : public TemplateParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 using TemplateParameter::matchArg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 Type *valType;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 Expression *specValue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 Expression *defaultValue;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 static AA *edummies;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 TemplateValueParameter(Loc loc, Identifier *ident, Type *valType, Expression *specValue, Expression *defaultValue);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 TemplateValueParameter *isTemplateValueParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 TemplateParameter *syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 bool declareParameter(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 bool semantic(Scope *sc, TemplateParameters *parameters);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 void print(RootObject *oarg, RootObject *oded);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 RootObject *specialization();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 RootObject *defaultArg(Loc instLoc, Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 bool hasDefaultArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 void *dummyArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 /* Syntax:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 * specType ident : specAlias = defaultAlias
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 class TemplateAliasParameter : public TemplateParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 using TemplateParameter::matchArg;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240 Type *specType;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 RootObject *specAlias;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 RootObject *defaultAlias;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 static Dsymbol *sdummy;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 TemplateAliasParameter(Loc loc, Identifier *ident, Type *specType, RootObject *specAlias, RootObject *defaultAlias);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 TemplateAliasParameter *isTemplateAliasParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 TemplateParameter *syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 bool declareParameter(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 bool semantic(Scope *sc, TemplateParameters *parameters);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 void print(RootObject *oarg, RootObject *oded);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 RootObject *specialization();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 RootObject *defaultArg(Loc instLoc, Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 bool hasDefaultArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 void *dummyArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 /* Syntax:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 * ident ...
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 class TemplateTupleParameter : public TemplateParameter
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267 TemplateTupleParameter(Loc loc, Identifier *ident);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 TemplateTupleParameter *isTemplateTupleParameter();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 TemplateParameter *syntaxCopy();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271 bool declareParameter(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 bool semantic(Scope *sc, TemplateParameters *parameters);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 void print(RootObject *oarg, RootObject *oded);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 RootObject *specialization();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 RootObject *defaultArg(Loc instLoc, Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 bool hasDefaultArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 MATCH matchArg(Loc loc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 void *dummyArg();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 /* Given:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 * foo!(args) =>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 * name = foo
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 * tiargs = args
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 class TemplateInstance : public ScopeDsymbol
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 Identifier *name;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 // Array of Types/Expressions of template
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 // instance arguments [int*, char, 10*10]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 Objects *tiargs;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 // Array of Types/Expressions corresponding
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 // to TemplateDeclaration.parameters
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 // [int, char, 100]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 Objects tdtypes;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 Dsymbol *tempdecl; // referenced by foo.bar.abc
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 Dsymbol *enclosing; // if referencing local symbols, this is the context
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 Dsymbol *aliasdecl; // !=NULL if instance is an alias for its sole member
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 TemplateInstance *inst; // refer to existing instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 ScopeDsymbol *argsym; // argument symbol table
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307 int inuse; // for recursive expansion detection
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 int nest; // for recursive pretty printing detection
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 bool semantictiargsdone; // has semanticTiargs() been done?
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 bool havetempdecl; // if used second constructor
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 bool gagged; // if the instantiation is done with error gagging
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 hash_t hash; // cached result of toHash()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 Expressions *fargs; // for function template, these are the function arguments
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 TemplateInstances* deferred;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 Module *memberOf; // if !null, then this TemplateInstance appears in memberOf.members[]
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 // Used to determine the instance needs code generation.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 // Note that these are inaccurate until semantic analysis phase completed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 TemplateInstance *tinst; // enclosing template instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 TemplateInstance *tnext; // non-first instantiated instances
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 Module *minst; // the top module that instantiated this instance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 TemplateInstance(Loc loc, Identifier *temp_id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 TemplateInstance(Loc loc, TemplateDeclaration *tempdecl, Objects *tiargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 static Objects *arraySyntaxCopy(Objects *objs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 Dsymbol *syntaxCopy(Dsymbol *);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 void semantic(Scope *sc, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 void semantic(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 void semantic2(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 void semantic3(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 Dsymbol *toAlias(); // resolve real symbol
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 const char *kind() const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 bool oneMember(Dsymbol **ps, Identifier *ident);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 const char *toChars();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 const char* toPrettyCharsHelper();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 void printInstantiationTrace();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 Identifier *getIdent();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 int compare(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 hash_t toHash();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 bool needsCodegen();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 // Internal
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 bool findTempDecl(Scope *sc, WithScopeSymbol **pwithsym);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 bool updateTempDecl(Scope *sc, Dsymbol *s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 static bool semanticTiargs(Loc loc, Scope *sc, Objects *tiargs, int flags);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 bool semanticTiargs(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 bool findBestMatch(Scope *sc, Expressions *fargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 bool needsTypeInference(Scope *sc, int flag = 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 bool hasNestedArgs(Objects *tiargs, bool isstatic);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 Dsymbols *appendToModuleMember();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 void declareParameters(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 Identifier *genIdent(Objects *args);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 void expandMembers(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 void tryExpandMembers(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 void trySemantic3(Scope *sc2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 TemplateInstance *isTemplateInstance() { return this; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 class TemplateMixin : public TemplateInstance
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 public:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 TypeQualified *tqual;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 TemplateMixin(Loc loc, Identifier *ident, TypeQualified *tqual, Objects *tiargs);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 Dsymbol *syntaxCopy(Dsymbol *s);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 void semantic(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 void semantic2(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 void semantic3(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 const char *kind() const;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 bool oneMember(Dsymbol **ps, Identifier *ident);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 int apply(Dsymbol_apply_ft_t fp, void *param);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 bool hasPointers();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 void setFieldOffset(AggregateDeclaration *ad, unsigned *poffset, bool isunion);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 const char *toChars();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 bool findTempDecl(Scope *sc);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 TemplateMixin *isTemplateMixin() { return this; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 void accept(Visitor *v) { v->visit(this); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 Expression *isExpression(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 Dsymbol *isDsymbol(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 Type *isType(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 Tuple *isTuple(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 Parameter *isParameter(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 bool arrayObjectIsError(Objects *args);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 bool isError(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394 Type *getType(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 Dsymbol *getDsymbol(RootObject *o);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 RootObject *objectSyntaxCopy(RootObject *o);