annotate dmd/CallExp.d @ 178:e3afd1303184

Many small bugs fixed Made all classes derive from TObject to detect memory leaks (functionality is disabled for now) Began work on overriding backend memory allocations (to avoid memory leaks)
author korDen
date Sun, 17 Oct 2010 07:42:00 +0400
parents af1bebfd96a4
children cd48cb899aee
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1 module dmd.CallExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
2
114
e28b18c23469 added a module dmd.common for commonly used stuff
Trass3r
parents: 109
diff changeset
3 import dmd.common;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
4 import dmd.ErrorExp;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
5 import dmd.Expression;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
6 import dmd.Cast;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
7 import dmd.WANT;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
8 import dmd.BUILTIN;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
9 import dmd.TypeFunction;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
10 import dmd.ScopeDsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
11 import dmd.CastExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
12 import dmd.GlobalExpressions;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
13 import dmd.TypePointer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
14 import dmd.ThisExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
15 import dmd.OverExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
16 import dmd.Dsymbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
17 import dmd.CSX;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
18 import dmd.AggregateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
19 import dmd.TypeDelegate;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
20 import dmd.ClassDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
21 import dmd.DsymbolExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
22 import dmd.DotExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
23 import dmd.TemplateExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
24 import dmd.TypeStruct;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
25 import dmd.TypeClass;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
26 import dmd.Identifier;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
27 import dmd.Lexer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
28 import dmd.VarDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
29 import dmd.DeclarationExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
30 import dmd.CtorDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
31 import dmd.PtrExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
32 import dmd.TemplateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
33 import dmd.StructLiteralExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
34 import dmd.StructDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
35 import dmd.DotTemplateExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
36 import dmd.CommaExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
37 import dmd.AggregateDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
38 import dmd.FuncDeclaration;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
39 import dmd.Type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
40 import dmd.ScopeExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
41 import dmd.VarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
42 import dmd.STC;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
43 import dmd.LINK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
44 import dmd.Global;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
45 import dmd.DotTemplateInstanceExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
46 import dmd.TemplateInstance;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
47 import dmd.DelegateExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
48 import dmd.IdentifierExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
49 import dmd.DotVarExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
50 import dmd.DotIdExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
51 import dmd.TY;
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
52 import dmd.TRUST;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
53 import dmd.Id;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
54 import dmd.TypeAArray;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
55 import dmd.RemoveExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
56 import dmd.backend.elem;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
57 import dmd.UnaExp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
58 import dmd.InterState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
59 import dmd.OutBuffer;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
60 import dmd.Loc;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
61 import dmd.Scope;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
62 import dmd.InlineCostState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
63 import dmd.IRState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
64 import dmd.InlineDoState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
65 import dmd.HdrGenState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
66 import dmd.InlineScanState;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
67 import dmd.ArrayTypes;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
68 import dmd.TOK;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
69 import dmd.PREC;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
70 import dmd.expression.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
71 import dmd.backend.Symbol;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
72 import dmd.backend.TYPE;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
73 import dmd.backend.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
74 import dmd.backend.TYM;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
75 import dmd.codegen.Util;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
76
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
77 import std.stdio;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
78
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 class CallExp : UnaExp
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81 Expressions arguments;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
83 this(Loc loc, Expression e, Expressions exps)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
85 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
86
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
87 super(loc, TOK.TOKcall, CallExp.sizeof, e);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 this.arguments = exps;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 this(Loc loc, Expression e)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
93 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
94
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 super(loc, TOK.TOKcall, CallExp.sizeof, e);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
96 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 this(Loc loc, Expression e, Expression earg1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
100 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
101
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
102 super(loc, TOK.TOKcall, CallExp.sizeof, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
103
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
104 auto arguments = new Expressions();
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
105 if (earg1)
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
106 {
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
107 arguments.setDim(1);
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
108 arguments[0] = earg1;
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
109 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 this.arguments = arguments;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 this(Loc loc, Expression e, Expression earg1, Expression earg2)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
114 {
178
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
115 register();
e3afd1303184 Many small bugs fixed
korDen
parents: 135
diff changeset
116
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
117 super(loc, TOK.TOKcall, CallExp.sizeof, e);
66
efb1e5bdf63c more implementations
korDen
parents: 64
diff changeset
118
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
119 auto arguments = new Expressions();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
120 arguments.setDim(2);
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
121 arguments[0] = earg1;
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
122 arguments[1] = earg2;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
123
66
efb1e5bdf63c more implementations
korDen
parents: 64
diff changeset
124 this.arguments = arguments;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
127 override Expression syntaxCopy()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
129 return new CallExp(loc, e1.syntaxCopy(), arraySyntaxCopy(arguments));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
132 override Expression semantic(Scope sc)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
133 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
134 TypeFunction tf;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
135 FuncDeclaration f;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
136 Type t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
137 int istemp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
138 Objects targsi; // initial list of template arguments
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
139 TemplateInstance tierror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
140
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
141 version (LOGSEMANTIC)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
142 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
143 printf("CallExp.semantic() %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
144 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
145 if (type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
146 return this; // semantic() already run
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
147
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
148 static if (false)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
149 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
150 if (arguments && arguments.dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
151 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
152 Expression earg = cast(Expression)arguments.data[0];
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
153 earg.print();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
154 if (earg.type) earg.type.print();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
155 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
156 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
157
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
158 if (e1.op == TOK.TOKdelegate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
159 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
160 DelegateExp de = cast(DelegateExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
161
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
162 e1 = new DotVarExp(de.loc, de.e1, de.func);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
163 return semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
164 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
165
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
166 /* Transform:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
167 * array.id(args) into .id(array,args)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
168 * aa.remove(arg) into delete aa[arg]
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
169 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
170 if (e1.op == TOK.TOKdot)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
171 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
172 // BUG: we should handle array.a.b.c.e(args) too
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
173
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
174 DotIdExp dotid = cast(DotIdExp)(e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
175 dotid.e1 = dotid.e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
176 assert(dotid.e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
177 if (dotid.e1.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
178 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
179 TY e1ty = dotid.e1.type.toBasetype().ty;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
180 if (e1ty == TY.Taarray && dotid.ident == Id.remove)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
181 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
182 if (!arguments || arguments.dim != 1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
183 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
184 error("expected key as argument to aa.remove()");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
185 goto Lagain;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
186 }
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
187 auto key = arguments[0];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
188 key = key.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
189 key = resolveProperties(sc, key);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
190 key.rvalue();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
191
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
192 auto taa = cast(TypeAArray)dotid.e1.type.toBasetype();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
193 key = key.implicitCastTo(sc, taa.index);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
194
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
195 return new RemoveExp(loc, dotid.e1, key);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
196 }
109
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 96
diff changeset
197 else if (e1ty == TY.Tarray || e1ty == TY.Tsarray ||
ceda59b4d255 expression.c changes, now only ddoc should be left
Trass3r
parents: 96
diff changeset
198 (e1ty == Taarray && dotid.ident != Id.apply && dotid.ident != Id.applyReverse))
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
199 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
200 if (!arguments)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
201 arguments = new Expressions();
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
202 arguments.shift(dotid.e1);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
203 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
204 e1 = new DotIdExp(dotid.loc, new IdentifierExp(dotid.loc, Id.empty), dotid.ident);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
205 } else {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
206 e1 = new IdentifierExp(dotid.loc, dotid.ident);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
207 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
208 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
209 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
210 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
211
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
212 static if (true) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
213 /* This recognizes:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
214 * foo!(tiargs)(funcargs)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
215 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
216 if (e1.op == TOK.TOKimport && !e1.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
217 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
218 ScopeExp se = cast(ScopeExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
219 TemplateInstance ti = se.sds.isTemplateInstance();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
220 if (ti && !ti.semanticRun)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
221 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
222 /* Attempt to instantiate ti. If that works, go with it.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
223 * If not, go with partial explicit specialization.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
224 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
225 ti.semanticTiargs(sc);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
226 if (ti.needsTypeInference(sc))
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
227 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
228 /* Go with partial explicit specialization
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
229 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
230 targsi = ti.tiargs;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
231 tierror = ti; // for error reporting
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
232 e1 = new IdentifierExp(loc, ti.name);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
233 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
234 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
235 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
236 ti.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
237 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
238 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
239 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
240
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
241 /* This recognizes:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
242 * expr.foo!(tiargs)(funcargs)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
243 */
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
244 Ldotti:
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
245 if (e1.op == TOK.TOKdotti && !e1.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
246 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
247 DotTemplateInstanceExp se = cast(DotTemplateInstanceExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
248 TemplateInstance ti = se.ti;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
249 if (!ti.semanticRun)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
250 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
251 /* Attempt to instantiate ti. If that works, go with it.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
252 * If not, go with partial explicit specialization.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
253 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
254 ti.semanticTiargs(sc);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
255 static if (false) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
256 Expression etmp = e1.trySemantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
257 if (etmp)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
258 e1 = etmp; // it worked
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
259 else // didn't work
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
260 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
261 targsi = ti.tiargs;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
262 tierror = ti; // for error reporting
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
263 e1 = new DotIdExp(loc, se.e1, ti.name);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
264 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
265 } else {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
266 if (!ti.tempdecl)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
267 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
268 se.getTempdecl(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
269 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
270 if (ti.tempdecl && ti.needsTypeInference(sc))
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
271 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
272 /* Go with partial explicit specialization
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
273 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
274 targsi = ti.tiargs;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
275 tierror = ti; // for error reporting
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
276 e1 = new DotIdExp(loc, se.e1, ti.name);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
277 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
278 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
279 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
280 e1 = e1.semantic(sc);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
281 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
282 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
283 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
284 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
285 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
286
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
287 istemp = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
288 Lagain:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
289 //printf("Lagain: %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
290 f = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
291 if (e1.op == TOK.TOKthis || e1.op == TOK.TOKsuper)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
292 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
293 // semantic() run later for these
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
294 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
295 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
296 {
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
297 if (e1.op == TOK.TOKdot)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
298 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
299 auto die = cast(DotIdExp)e1;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
300 e1 = die.semantic(sc, 1);
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
301 /* Look for e1 having been rewritten to expr.opDispatch!(string)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
302 * We handle such earlier, so go back.
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
303 * Note that in the rewrite, we carefully did not run semantic() on e1
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
304 */
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
305 if (e1.op == TOK.TOKdotti && !e1.type)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
306 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
307 goto Ldotti;
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
308 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
309 }
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
310 else
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
311 UnaExp.semantic(sc);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
312
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
313 /* Look for e1 being a lazy parameter
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
314 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
315 if (e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
316 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
317 VarExp ve = cast(VarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
318
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
319 if (ve.var.storage_class & STC.STClazy)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
320 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
321 TypeFunction tff = new TypeFunction(null, ve.var.type, 0, LINK.LINKd);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
322 TypeDelegate t = new TypeDelegate(tff);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
323 ve.type = t.semantic(loc, sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
324 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
325 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
326
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
327 if (e1.op == TOK.TOKimport)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
328 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
329 // Perhaps this should be moved to ScopeExp.semantic()
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
330 ScopeExp se = cast(ScopeExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
331 e1 = new DsymbolExp(loc, se.sds);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
332 e1 = e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
333 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
334 ///static if (true) { // patch for #540 by Oskar Linde
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
335 else if (e1.op == TOK.TOKdotexp)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
336 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
337 DotExp de = cast(DotExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
338
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
339 if (de.e2.op == TOK.TOKimport)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
340 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
341 // This should *really* be moved to ScopeExp.semantic()
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
342 ScopeExp se = cast(ScopeExp)de.e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
343 de.e2 = new DsymbolExp(loc, se.sds);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
344 de.e2 = de.e2.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
345 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
346
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
347 if (de.e2.op == TOK.TOKtemplate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
348 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
349 TemplateExp te = cast(TemplateExp)de.e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
350 e1 = new DotTemplateExp(loc,de.e1,te.td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
351 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
352 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
353 ///}
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
354 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
355
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
356 if (e1.op == TOK.TOKcomma)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
357 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
358 CommaExp ce = cast(CommaExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
359
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
360 e1 = ce.e2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
361 e1.type = ce.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
362 ce.e2 = this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
363 ce.type = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
364 return ce.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
365 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
366
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
367 t1 = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
368 if (e1.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
369 t1 = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
370
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
371 // Check for call operator overload
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
372 if (t1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
373 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
374 AggregateDeclaration ad;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
375
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
376 if (t1.ty == TY.Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
377 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
378 ad = (cast(TypeStruct)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
379 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
380 // First look for constructor
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
381 if (ad.ctor && arguments && arguments.dim)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
382 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
383 // Create variable that will get constructed
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
384 Identifier idtmp = Lexer.uniqueId("__ctmp");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
385 VarDeclaration tmp = new VarDeclaration(loc, t1, idtmp, null);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
386 Expression av = new DeclarationExp(loc, tmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
387 av = new CommaExp(loc, av, new VarExp(loc, tmp));
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
388
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
389 Expression e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
390 CtorDeclaration cf = ad.ctor.isCtorDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
391 if (cf)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
392 e = new DotVarExp(loc, av, cf, 1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
393 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
394 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
395 TemplateDeclaration td = ad.ctor.isTemplateDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
396 assert(td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
397 e = new DotTemplateExp(loc, av, td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
398 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
399 e = new CallExp(loc, e, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
400 version (STRUCTTHISREF) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
401 } else {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
402 /* Constructors return a pointer to the instance
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
403 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
404 e = new PtrExp(loc, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
405 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
406 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
407 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
408 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
409 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
410 // No constructor, look for overload of opCall
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
411 if (search_function(ad, Id.call))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
412 goto L1; // overload of opCall, therefore it's a call
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
413
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
414 if (e1.op != TOK.TOKtype)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
415 error("%s %s does not overload ()", ad.kind(), ad.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
416
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
417 /* It's a struct literal
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
418 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
419 Expression e = new StructLiteralExp(loc, cast(StructDeclaration)ad, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
420 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
421 e.type = e1.type; // in case e1.type was a typedef
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
422 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
423 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
424 else if (t1.ty == TY.Tclass)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
425 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
426 ad = (cast(TypeClass)t1).sym;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
427 goto L1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
428 L1:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
429 // Rewrite as e1.call(arguments)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
430 Expression e = new DotIdExp(loc, e1, Id.call);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
431 e = new CallExp(loc, e, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
432 e = e.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
433 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
434 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
435 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
436
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
437 arrayExpressionSemantic(arguments, sc);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
438 preFunctionParameters(loc, sc, arguments);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
439
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
440 if (e1.op == TOK.TOKdotvar && t1.ty == TY.Tfunction ||
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
441 e1.op == TOK.TOKdottd)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
442 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
443 DotVarExp dve;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
444 DotTemplateExp dte;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
445 AggregateDeclaration ad;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
446 UnaExp ue = cast(UnaExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
447
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
448 if (e1.op == TOK.TOKdotvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
449 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
450 // Do overload resolution
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
451 dve = cast(DotVarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
452
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
453 f = dve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
454 assert(f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
455 f = f.overloadResolve(loc, ue.e1, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
456
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
457 ad = f.toParent().isAggregateDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
458 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
459 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
460 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
461 dte = cast(DotTemplateExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
462 TemplateDeclaration td = dte.td;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
463 assert(td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
464
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
465 if (!arguments)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
466 // Should fix deduceFunctionTemplate() so it works on null argument
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
467 arguments = new Expressions();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
468
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
469 f = td.deduceFunctionTemplate(sc, loc, targsi, ue.e1, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
470 if (!f)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
471 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
472 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
473 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
474 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
475 ad = td.toParent().isAggregateDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
476 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
477
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
478 if (f.needThis())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
479 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
480 ue.e1 = getRightThis(loc, sc, ad, ue.e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
481 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
482
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
483 /* Cannot call public functions from inside invariant
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
484 * (because then the invariant would have infinite recursion)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
485 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
486 if (sc.func && sc.func.isInvariantDeclaration() &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
487 ue.e1.op == TOK.TOKthis && f.addPostInvariant())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
488 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
489 error("cannot call public/export function %s from invariant", f.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
490 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
491
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
492 checkDeprecated(sc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
493 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
494 checkPurity(sc, f);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
495 checkSafety(sc, f);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
496 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
497 accessCheck(loc, sc, ue.e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
498 if (!f.needThis())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
499 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
500 VarExp ve = new VarExp(loc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
501 e1 = new CommaExp(loc, ue.e1, ve);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
502 e1.type = f.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
503 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
504 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
505 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
506 if (e1.op == TOK.TOKdotvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
507 dve.var = f;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
508 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
509 e1 = new DotVarExp(loc, dte.e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
510
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
511 e1.type = f.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
512 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
513 printf("ue.e1 = %s\n", ue.e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
514 printf("f = %s\n", f.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
515 printf("t = %s\n", t.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
516 printf("e1 = %s\n", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
517 printf("e1.type = %s\n", e1.type.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
518 }
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
519 // Const member function can take const/immutable/mutable/inout this
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
520 if (!(f.type.isConst()))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
521 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
522 // Check for const/immutable compatibility
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
523 Type tthis = ue.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
524 if (tthis.ty == TY.Tpointer)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
525 tthis = tthis.nextOf().toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
526
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
527 static if (false) { // this checking should have been already done
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
528 if (f.type.isImmutable())
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
529 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
530 if (tthis.mod != MOD.MODimmutable)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
531 error("%s can only be called with an immutable object", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
532 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
533 else if (f.type.isShared())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
534 {
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
535 if (tthis.mod != MOD.MODimmutable && tthis.mod != MOD.MODshared && tthis.mod != (MOD.MODshared | MOD.MODconst))
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
536 error("shared %s can only be called with a shared or immutable object", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
537 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
538 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
539 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
540 if (tthis.mod != MOD.MODundefined)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
541 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
542 //printf("mod = %x\n", tthis.mod);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
543 error("%s can only be called with a mutable object, not %s", e1.toChars(), tthis.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
544 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
545 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
546 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
547 /* Cannot call mutable method on a final struct
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
548 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
549 if (tthis.ty == TY.Tstruct &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
550 ue.e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
551 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
552 VarExp v = cast(VarExp)ue.e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
553 if (v.var.storage_class & STC.STCfinal)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
554 error("cannot call mutable method on final struct");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
555 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
556 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
557
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
558 // See if we need to adjust the 'this' pointer
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
559 AggregateDeclaration add = f.isThis();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
560 ClassDeclaration cd = ue.e1.type.isClassHandle();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
561 if (add && cd && add.isClassDeclaration() && add != cd && ue.e1.op != TOK.TOKsuper)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
562 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
563 ue.e1 = ue.e1.castTo(sc, add.type); //new CastExp(loc, ue.e1, add.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
564 ue.e1 = ue.e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
565 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
566 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
567 t1 = e1.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
568 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
569 else if (e1.op == TOK.TOKsuper)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
570 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
571 // Base class constructor call
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
572 ClassDeclaration cd = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
573
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
574 if (sc.func)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
575 cd = sc.func.toParent().isClassDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
576 if (!cd || !cd.baseClass || !sc.func.isCtorDeclaration())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
577 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
578 error("super class constructor call must be in a constructor");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
579 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
580 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
581 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
582 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
583 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
584 if (!cd.baseClass.ctor)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
585 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
586 error("no super class constructor for %s", cd.baseClass.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
587 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
588 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
589 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
590 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
591 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
592 if (!sc.intypeof)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
593 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
594 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
595 if (sc.callSuper & (CSX.CSXthis | CSX.CSXsuper))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
596 error("reference to this before super()");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
597 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
598 if (sc.noctor || sc.callSuper & CSX.CSXlabel)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
599 error("constructor calls not allowed in loops or after labels");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
600 if (sc.callSuper & (CSX.CSXsuper_ctor | CSX.CSXthis_ctor))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
601 error("multiple constructor calls");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
602 sc.callSuper |= CSX.CSXany_ctor | CSX.CSXsuper_ctor;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
603 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
604
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
605 f = resolveFuncCall(sc, loc, cd.baseClass.ctor, null, null, arguments, 0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
606 checkDeprecated(sc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
607 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
608 checkPurity(sc, f);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
609 checkSafety(sc, f);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
610 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
611 e1 = new DotVarExp(e1.loc, e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
612 e1 = e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
613 t1 = e1.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
614 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
615 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
616 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
617 else if (e1.op == TOK.TOKthis)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
618 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
619 // same class constructor call
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
620 AggregateDeclaration cd = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
621
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
622 if (sc.func)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
623 cd = sc.func.toParent().isAggregateDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
624 if (!cd || !sc.func.isCtorDeclaration())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
625 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
626 error("constructor call must be in a constructor");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
627 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
628 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
629 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
630 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
631 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
632 if (!sc.intypeof)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
633 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
634 static if (false) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
635 if (sc.callSuper & (CSXthis | CSXsuper))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
636 error("reference to this before super()");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
637 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
638 if (sc.noctor || sc.callSuper & CSX.CSXlabel)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
639 error("constructor calls not allowed in loops or after labels");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
640 if (sc.callSuper & (CSX.CSXsuper_ctor | CSX.CSXthis_ctor))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
641 error("multiple constructor calls");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
642 sc.callSuper |= CSX.CSXany_ctor | CSX.CSXthis_ctor;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
643 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
644
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
645 f = resolveFuncCall(sc, loc, cd.ctor, null, null, arguments, 0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
646 checkDeprecated(sc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
647 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
648 checkPurity(sc, f);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
649 checkSafety(sc, f);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
650 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
651 e1 = new DotVarExp(e1.loc, e1, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
652 e1 = e1.semantic(sc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
653 t1 = e1.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
654
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
655 // BUG: this should really be done by checking the static
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
656 // call graph
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
657 if (f == sc.func)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
658 error("cyclic constructor call");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
659 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
660 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
661 else if (e1.op == TOK.TOKoverloadset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
662 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
663 OverExp eo = cast(OverExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
664 FuncDeclaration ff = null;
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
665 Dsymbol s = null;
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
666 for(size_t i = 0; i<eo.vars.a.dim; i++)
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
667 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
668 s = eo.vars.a[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
669 FuncDeclaration f2 = s.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
670 if (f2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
671 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
672 f2 = f2.overloadResolve(loc, null, arguments, 1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
673 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
674 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
675 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
676 TemplateDeclaration td = s.isTemplateDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
677 assert(td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
678 f2 = td.deduceFunctionTemplate(sc, loc, targsi, null, arguments, 1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
679 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
680 if (f2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
681 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
682 if (ff)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
683 /* Error if match in more than one overload set,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
684 * even if one is a 'better' match than the other.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
685 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
686 ScopeDsymbol.multiplyDefined(loc, ff, f2);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
687 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
688 ff = f2;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
689 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
690 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
691 if (!ff)
79
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
692 {
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
693 // No overload matches
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
694 error("no overload matches for %s", s.toChars());
43073c7c7769 updated to 2.035
Trass3r
parents: 77
diff changeset
695 return new ErrorExp();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
696 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
697 e1 = new VarExp(loc, ff);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
698 goto Lagain;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
699 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
700 else if (!t1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
701 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
702 error("function expected before (), not '%s'", e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
703 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
704 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
705 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
706 else if (t1.ty != TY.Tfunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
707 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
708 if (t1.ty == TY.Tdelegate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
709 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
710 TypeDelegate td = cast(TypeDelegate)t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
711 assert(td.next.ty == TY.Tfunction);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
712 tf = cast(TypeFunction)(td.next);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
713 if (sc.func && sc.func.isPure() && !tf.ispure)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
714 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
715 error("pure function '%s' cannot call impure delegate '%s'", sc.func.toChars(), e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
716 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
717 if (sc.func && sc.func.isSafe() && tf.trust <= TRUST.TRUSTsystem)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
718 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
719 error("safe function '%s' cannot call system delegate '%s'", sc.func.toChars(), e1.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
720 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
721 goto Lcheckargs;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
722 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
723 else if (t1.ty == TY.Tpointer && (cast(TypePointer)t1).next.ty == TY.Tfunction)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
724 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
725 Expression e = new PtrExp(loc, e1);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
726 t1 = (cast(TypePointer)t1).next;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
727 if (sc.func && sc.func.isPure() && !(cast(TypeFunction)t1).ispure)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
728 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
729 error("pure function '%s' cannot call impure function pointer '%s'", sc.func.toChars(), e1.toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
730 }
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
731 if (sc.func && sc.func.isSafe() && !(cast(TypeFunction)t1).trust <= TRUST.TRUSTsystem)
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
732 {
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
733 error("safe function '%s' cannot call system function pointer '%s'", sc.func.toChars(), e1.toChars());
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
734 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
735 e.type = t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
736 e1 = e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
737 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
738 else if (e1.op == TOK.TOKtemplate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
739 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
740 TemplateExp te = cast(TemplateExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
741 f = te.td.deduceFunctionTemplate(sc, loc, targsi, null, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
742 if (!f)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
743 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
744 if (tierror)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
745 tierror.error("errors instantiating template"); // give better error message
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
746 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
747 return this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
748 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
749 if (f.needThis() && hasThis(sc))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
750 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
751 // Supply an implicit 'this', as in
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
752 // this.ident
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
753
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
754 e1 = new DotTemplateExp(loc, (new ThisExp(loc)).semantic(sc), te.td);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
755 goto Lagain;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
756 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
757
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
758 e1 = new VarExp(loc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
759 goto Lagain;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
760 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
761 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
762 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
763 error("function expected before (), not %s of type %s", e1.toChars(), e1.type.toChars());
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
764 return new ErrorExp();
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
765 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
766 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
767 else if (e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
768 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
769 // Do overload resolution
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
770 VarExp ve = cast(VarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
771
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
772 f = ve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
773 assert(f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
774
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
775 if (ve.hasOverloads)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
776 f = f.overloadResolve(loc, null, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
777
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
778 checkDeprecated(sc, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
779 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
780 checkPurity(sc, f);
130
60bb0fe4563e dmdfe 2.037 first main iteration
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 114
diff changeset
781 checkSafety(sc, f);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
782 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
783
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
784 if (f.needThis() && hasThis(sc))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
785 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
786 // Supply an implicit 'this', as in
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
787 // this.ident
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
788
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
789 e1 = new DotVarExp(loc, new ThisExp(loc), f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
790 goto Lagain;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
791 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
792
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
793 accessCheck(loc, sc, null, f);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
794
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
795 ve.var = f;
73
ef02e2e203c2 Updating to dmd2.033
korDen
parents: 72
diff changeset
796 // ve.hasOverloads = false;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
797 ve.type = f.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
798 t1 = f.type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
799 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
800 assert(t1.ty == TY.Tfunction);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
801 tf = cast(TypeFunction)t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
802
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
803 Lcheckargs:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
804 assert(tf.ty == TY.Tfunction);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
805
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
806 if (!arguments)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
807 arguments = new Expressions();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
808
135
af1bebfd96a4 dmd 2.038
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 130
diff changeset
809 type = functionParameters(loc, sc, tf, arguments);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
810
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
811 if (!type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
812 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
813 error("forward reference to inferred return type of function call %s", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
814 type = Type.terror;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
815 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
816
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
817 if (f && f.tintro)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
818 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
819 Type t = type;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
820 int offset = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
821 TypeFunction tff = cast(TypeFunction)f.tintro;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
822
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
823 if (tff.next.isBaseOf(t, &offset) && offset)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
824 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
825 type = tff.next;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
826 return castTo(sc, t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
827 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
828 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
829
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
830 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
831 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
832
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
833 override Expression optimize(int result)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
834 {
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
835 // writef("CallExp::optimize(result = %d) %s\n", result, toChars());
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
836 Expression e = this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
837
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
838 // Optimize parameters
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
839 if (arguments)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
840 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
841 foreach (ref Expression ee; arguments)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
842 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
843 ee = ee.optimize(WANT.WANTvalue);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
844 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
845 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
846
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
847 e1 = e1.optimize(result);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
848 if (e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
849 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
850 FuncDeclaration fd = (cast(VarExp)e1).var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
851 if (fd)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
852 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
853 BUILTIN b = fd.isBuiltin();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
854 if (b)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
855 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
856 e = eval_builtin(b, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
857 if (!e) // failed
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
858 e = this; // evaluate at runtime
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
859 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
860 else if (result & WANT.WANTinterpret)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
861 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
862 Expression eresult = fd.interpret(null, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
863 if (eresult && eresult !is EXP_VOID_INTERPRET)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
864 e = eresult;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
865 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
866 error("cannot evaluate %s at compile time", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
867 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
868 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
869 }
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
870 else if (e1.op == TOKdotvar && result & WANTinterpret)
acd69f84627e further work
Trass3r
parents: 90
diff changeset
871 {
acd69f84627e further work
Trass3r
parents: 90
diff changeset
872 DotVarExp dve = cast(DotVarExp) e1;
acd69f84627e further work
Trass3r
parents: 90
diff changeset
873 FuncDeclaration fd = dve.var.isFuncDeclaration();
acd69f84627e further work
Trass3r
parents: 90
diff changeset
874 if (fd)
acd69f84627e further work
Trass3r
parents: 90
diff changeset
875 {
acd69f84627e further work
Trass3r
parents: 90
diff changeset
876 Expression eresult = fd.interpret(null, arguments, dve.e1);
acd69f84627e further work
Trass3r
parents: 90
diff changeset
877 if (eresult && eresult != EXP_VOID_INTERPRET)
acd69f84627e further work
Trass3r
parents: 90
diff changeset
878 e = eresult;
acd69f84627e further work
Trass3r
parents: 90
diff changeset
879 else
acd69f84627e further work
Trass3r
parents: 90
diff changeset
880 error("cannot evaluate %s at compile time", toChars());
acd69f84627e further work
Trass3r
parents: 90
diff changeset
881 }
acd69f84627e further work
Trass3r
parents: 90
diff changeset
882 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
883
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
884 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
885 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
886
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
887 override Expression interpret(InterState istate)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
888 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
889 Expression e = EXP_CANT_INTERPRET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
890
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
891 version (LOG) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
892 printf("CallExp.interpret() %.*s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
893 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
894 if (e1.op == TOKdotvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
895 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
896 Expression pthis = (cast(DotVarExp)e1).e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
897 FuncDeclaration fd = (cast(DotVarExp)e1).var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
898 TypeFunction tf = fd ? cast(TypeFunction)fd.type : null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
899 if (tf)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
900 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
901 // Member function call
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
902 if(pthis.op == TOKthis)
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
903 pthis = istate.localThis;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
904 Expression eresult = fd.interpret(istate, arguments, pthis);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
905 if (eresult)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
906 e = eresult;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
907 else if (fd.type.toBasetype().nextOf().ty == Tvoid && !global.errors)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
908 e = EXP_VOID_INTERPRET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
909 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
910 error("cannot evaluate %s at compile time", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
911 return e;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
912 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
913 error("cannot evaluate %s at compile time", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
914 return EXP_CANT_INTERPRET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
915 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
916 if (e1.op == TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
917 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
918 FuncDeclaration fd = (cast(VarExp)e1).var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
919 if (fd)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
920 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
921 ///version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
922 BUILTIN b = fd.isBuiltin();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
923 if (b)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
924 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
925 scope Expressions args = new Expressions();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
926 args.setDim(arguments.dim);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
927 for (size_t i = 0; i < args.dim; i++)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
928 {
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
929 auto earg = arguments[i];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
930 earg = earg.interpret(istate);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
931 if (earg == EXP_CANT_INTERPRET)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
932 return earg;
84
be2ab491772e Expressions -> Vector!Expression
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 79
diff changeset
933 args[i] = earg;
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
934 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
935 e = eval_builtin(b, args);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
936 if (!e)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
937 e = EXP_CANT_INTERPRET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
938 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
939 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
940 ///}
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
941 // Inline .dup
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
942 if (fd.ident == Id.adDup && arguments && arguments.dim == 2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
943 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
944 e = arguments[1];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
945 e = e.interpret(istate);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
946 if (e !is EXP_CANT_INTERPRET)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
947 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
948 e = expType(type, e);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
949 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
950 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
951 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
952 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
953 Expression eresult = fd.interpret(istate, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
954 if (eresult)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
955 e = eresult;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
956 else if (fd.type.toBasetype().nextOf().ty == Tvoid && !global.errors)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
957 e = EXP_VOID_INTERPRET;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
958 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
959 error("cannot evaluate %s at compile time", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
960 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
961 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
962 }
63
cab4c37afb89 A bunch of implementations
korDen
parents: 0
diff changeset
963 return e;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
964 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
965
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
966 override bool checkSideEffect(int flag)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
967 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
968 version (DMDV2) {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
969 if (flag != 2)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
970 return true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
971
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
972 if (e1.checkSideEffect(2))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
973 return true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
974
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
975 /* If any of the arguments have side effects, this expression does
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
976 */
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
977 foreach (e; arguments)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
978 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
979 if (e.checkSideEffect(2))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
980 return true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
981 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
982
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
983 /* If calling a function or delegate that is typed as pure,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
984 * then this expression has no side effects.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
985 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
986 Type t = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
987 if (t.ty == TY.Tfunction && (cast(TypeFunction)t).ispure)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
988 return false;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
989 if (t.ty == TY.Tdelegate && (cast(TypeFunction)(cast(TypeDelegate)t).next).ispure)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
990 return false;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
991 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
992 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
993 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
994
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
995 override void toCBuffer(OutBuffer buf, HdrGenState* hgs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
996 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
997 int i;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
998 expToCBuffer(buf, hgs, e1, precedence[op]);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
999 buf.writeByte('(');
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1000 argsToCBuffer(buf, arguments, hgs);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1001 buf.writeByte(')');
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1002 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1003
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1004 override void dump(int indent)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1005 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1006 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1007 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1008
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1009 override elem* toElem(IRState* irs)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1010 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1011 //printf("CallExp::toElem('%s')\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1012 assert(e1.type);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1013 elem* ec;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1014 int directcall;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1015 FuncDeclaration fd;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1016 Type t1 = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1017 Type ectype = t1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1018
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1019 elem* ehidden = irs.ehidden;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1020 irs.ehidden = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1021
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1022 directcall = 0;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1023 fd = null;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1024 if (e1.op == TOK.TOKdotvar && t1.ty != TY.Tdelegate)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1025 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1026 DotVarExp dve = cast(DotVarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1027
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1028 fd = dve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1029 Expression ex = dve.e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1030 while (1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1031 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1032 switch (ex.op)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1033 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1034 case TOK.TOKsuper: // super.member() calls directly
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1035 case TOK.TOKdottype: // type.member() calls directly
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1036 directcall = 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1037 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1038
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1039 case TOK.TOKcast:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1040 ex = (cast(CastExp)ex).e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1041 continue;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1042
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1043 default:
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1044 //ex.dump(0);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1045 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1046 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1047 break;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1048 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1049 ec = dve.e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1050 ectype = dve.e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1051 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1052 else if (e1.op == TOK.TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1053 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1054 fd = (cast(VarExp)e1).var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1055
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1056 if (fd && fd.ident == Id.alloca && !fd.fbody && fd.linkage == LINK.LINKc && arguments && arguments.dim == 1)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1057 {
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1058 auto arg = arguments[0];
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1059 arg = arg.optimize(WANT.WANTvalue);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1060 if (arg.isConst() && arg.type.isintegral())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1061 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1062 long sz = arg.toInteger();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1063 if (sz > 0 && sz < 0x40000)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1064 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1065 // It's an alloca(sz) of a fixed amount.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1066 // Replace with an array allocated on the stack
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1067 // of the same size: char[sz] tmp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1068
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1069 Symbol* stmp;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1070 .type* t;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1071
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1072 assert(!ehidden);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1073 t = type_allocn(TYM.TYarray, tschar);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1074 t.Tdim = cast(uint)sz;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1075 stmp = symbol_genauto(t);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1076 ec = el_ptr(stmp);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1077 el_setLoc(ec,loc);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1078 return ec;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1079 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1080 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1081 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1082
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1083 ec = e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1084 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1085 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1086 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1087 ec = e1.toElem(irs);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1088 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1089 ec = callfunc(loc, irs, directcall, type, ec, ectype, fd, t1, ehidden, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1090 el_setLoc(ec,loc);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1091 return ec;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1092 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1093
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1094 override void scanForNestedRef(Scope sc)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1095 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1096 //printf("CallExp.scanForNestedRef(Scope *sc): %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1097 e1.scanForNestedRef(sc);
64
4290d870944a More fixes
korDen
parents: 63
diff changeset
1098 arrayExpressionScanForNestedRef(sc, arguments);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1099 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1100
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1101 version (DMDV2) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1102 override int isLvalue()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1103 {
96
acd69f84627e further work
Trass3r
parents: 90
diff changeset
1104 // if (type.toBasetype().ty == Tstruct)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1105 // return 1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1106 Type tb = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1107 if (tb.ty == Tfunction && (cast(TypeFunction)tb).isref)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1108 return 1; // function returns a reference
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1109 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1111 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1112 override Expression toLvalue(Scope sc, Expression e)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1113 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1114 if (isLvalue())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1115 return this;
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1116 return Expression.toLvalue(sc, e);
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1117 }
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1118
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1119 version (DMDV2) {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1120 override bool canThrow()
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1121 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1122 //printf("CallExp::canThrow() %s\n", toChars());
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1123 if (e1.canThrow())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1124 return true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1125
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1126 /* If any of the arguments can throw, then this expression can throw
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1127 */
90
39648eb578f6 more Expressions work
Eldar Insafutdinov <e.insafutdinov@gmail.com>
parents: 84
diff changeset
1128 foreach (e; arguments)
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1129 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1130 if (e && e.canThrow())
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1131 return true;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1132 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1133
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1134 if (global.errors && !e1.type)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1135 return false; // error recovery
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1136
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1137 /* If calling a function or delegate that is typed as nothrow,
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1138 * then this expression cannot throw.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1139 * Note that pure functions can throw.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1140 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1141 Type t = e1.type.toBasetype();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1142 if (t.ty == TY.Tfunction && (cast(TypeFunction)t).isnothrow)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1143 return false;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1144 if (t.ty == TY.Tdelegate && (cast(TypeFunction)(cast(TypeDelegate)t).next).isnothrow)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1145 return false;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1146
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1147 return true;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1148 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1149 }
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1150 override int inlineCost(InlineCostState* ics)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1151 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1152 return 1 + e1.inlineCost(ics) + arrayInlineCost(ics, arguments);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1153 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1154
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1155 override Expression doInline(InlineDoState ids)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1156 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1157 CallExp ce = cast(CallExp)copy();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1158 ce.e1 = e1.doInline(ids);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1159 ce.arguments = arrayExpressiondoInline(arguments, ids);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1160 return ce;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1161 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1162
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1163 override Expression inlineScan(InlineScanState* iss)
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1164 {
72
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1165 Expression e = this;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1166
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1167 //printf("CallExp.inlineScan()\n");
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1168 e1 = e1.inlineScan(iss);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1169 arrayInlineScan(iss, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1170
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1171 if (e1.op == TOKvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1172 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1173 VarExp ve = cast(VarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1174 FuncDeclaration fd = ve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1175
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1176 if (fd && fd != iss.fd && fd.canInline(0))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1177 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1178 e = fd.doInline(iss, null, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1179 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1180 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1181 else if (e1.op == TOKdotvar)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1182 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1183 DotVarExp dve = cast(DotVarExp)e1;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1184 FuncDeclaration fd = dve.var.isFuncDeclaration();
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1185
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1186 if (fd && fd != iss.fd && fd.canInline(1))
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1187 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1188 if (dve.e1.op == TOKcall &&
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1189 dve.e1.type.toBasetype().ty == Tstruct)
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1190 {
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1191 /* To create ethis, we'll need to take the address
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1192 * of dve.e1, but this won't work if dve.e1 is
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1193 * a function call.
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1194 */
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1195 ;
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1196 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1197 else
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1198 e = fd.doInline(iss, dve.e1, arguments);
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1199 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1200 }
2e2a5c3f943a reduced warnings by adding override to the methods
Trass3r
parents: 66
diff changeset
1201
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1202 return e;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1203 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1204 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1205