annotate dmd/cast.c @ 341:1bb99290e03a trunk

[svn r362] Started merging the old 'test' dir as well as the newer 'tangotests' dir into 'tests/mini' and 'tests/minicomplex'.
author lindquist
date Sun, 13 Jul 2008 02:51:19 +0200
parents aaade6ded589
children 6aee82889553
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
2 // Copyright (c) 1999-2008 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
10 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
11 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
12
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
13 #if _WIN32 || IN_GCC || IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
14 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
15 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
16 #include "../root/mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
17 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
18
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
19 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
20 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
21 #include "utf.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
22 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
23 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
24
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
25 /* ==================== implicitCast ====================== */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
26
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
27 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
28 * Do an implicit cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
29 * Issue error if it can't be done.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
30 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
31
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
32 Expression *Expression::implicitCastTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
33 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
34 //printf("implicitCastTo(%s) => %s\n", type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
35 if (implicitConvTo(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
36 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
37 if (global.params.warnings &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
38 Type::impcnvWarn[type->toBasetype()->ty][t->toBasetype()->ty] &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
39 op != TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
40 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
41 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
42
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
43 if (e->op == TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
44 return e->implicitCastTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
45
215
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 159
diff changeset
46 warning("%s: implicit conversion of expression (%s) of type %s to %s can cause loss of data",
a58d8f4b84df [svn r231] Changed: warnings are no longer treated as an error.
lindquist
parents: 159
diff changeset
47 loc.toChars(), toChars(), type->toChars(), t->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
48 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
49 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
50 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
51
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
52 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
53 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
54 return e->implicitCastTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
55
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
56 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
57 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
58 type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
59 printf("to:\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
60 t->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
61 printf("%p %p type: %s to: %s\n", type->deco, t->deco, type->deco, t->deco);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
62 //printf("%p %p %p\n", type->next->arrayOf(), type, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
63 fflush(stdout);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
64 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
65 if (!t->deco)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
66 { /* Can happen with:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
67 * enum E { One }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
68 * class A
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
69 * { static void fork(EDG dg) { dg(E.One); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
70 * alias void delegate(E) EDG;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
71 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
72 * Should eventually make it work.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
73 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
74 error("forward reference to type %s", t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
75 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
76 else if (t->reliesOnTident())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
77 error("forward reference to type %s", t->reliesOnTident()->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
78
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
79 error("cannot implicitly convert expression (%s) of type %s to %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
80 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
81 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
82 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
84 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
85 * Return !=0 if we can implicitly convert this to type t.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
86 * Don't do the actual cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
87 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
88
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
89 MATCH Expression::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
90 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
91 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
92 printf("Expression::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
93 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
94 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
95 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
96 { error("%s is not an expression", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
97 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
98 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
99 if (t->ty == Tbit && isBit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
100 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
101 Expression *e = optimize(WANTvalue | WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
102 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
103 { //printf("optimzed to %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
104 return e->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
106 MATCH match = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
107 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
108 return match;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
109 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
110 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
111 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
112 { TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
113 TypeFunction *tf = (TypeFunction *)td->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
114
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
115 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
116 !(tf->arguments && tf->arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
117 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
118 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
119 match = type->implicitConvTo(tf->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
120 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
121 return match;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
122 if (tf->next->toBasetype()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
123 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
124 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
125 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
126 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
127 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
128 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
129
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
131 MATCH IntegerExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
133 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
134 printf("IntegerExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
135 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
136 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
137 if (type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
138 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
140 enum TY ty = type->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
141 enum TY toty = t->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
142
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
143 if (type->implicitConvTo(t) == MATCHnomatch && t->ty == Tenum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
144 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
145 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
147
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
148 switch (ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
149 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
150 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
151 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
152 value &= 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
153 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
154 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
156 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
157 value = (signed char)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
158 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
159 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
161 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
162 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
163 value &= 0xFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
164 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
165 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
166
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
167 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
168 value = (short)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
169 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
170 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
171
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
172 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
173 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
174 value &= 0xFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
175 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
176 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
177
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
178 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
179 value = (int)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
180 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
181
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
182 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
183 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
184 value &= 0xFFFFFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
185 ty = Tuns32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
186 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
188 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
189 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
190 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
191
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
192 // Only allow conversion if no change in value
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
193 switch (toty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
194 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
195 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
196 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
197 if ((value & 1) != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
198 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
199 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
200
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
201 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
202 if ((signed char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
203 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
204 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
205
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
206 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
207 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
208 //printf("value = %llu %llu\n", (integer_t)(unsigned char)value, value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
209 if ((unsigned char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
210 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
211 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
212
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
213 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
214 if ((short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
215 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
216 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
218 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
219 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
220 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
221 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
222
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
223 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
224 if (ty == Tuns32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
227 else if ((int)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
228 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
229 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
231 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
232 if (ty == Tint32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
233 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
235 else if ((unsigned)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
236 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
237 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
239 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
240 if (value > 0x10FFFFUL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
241 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
242 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
243
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
244 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
245 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
246 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
247 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
248
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
249 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
250 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
251 volatile float f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
252 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
253 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
254 f = (float)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
255 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
256 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
257 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
258 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
259 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
260 f = (float)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
261 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
262 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
263 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
264 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
265 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
266
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
267 case Tfloat64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
268 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
269 volatile double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
270 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
271 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
272 f = (double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
273 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
274 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
275 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
276 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
277 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
278 f = (double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
279 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
280 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
281 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
282 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
283 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
284
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
285 case Tfloat80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
286 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
287 volatile long double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
288 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
289 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
290 f = (long double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
291 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
292 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
294 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
295 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
296 f = (long double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
297 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
298 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
299 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
300 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
302 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
303 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
305 Lyes:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
306 //printf("MATCHconvert\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
307 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
308
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
309 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
310 //printf("MATCHnomatch\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
311 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
314 MATCH NullExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
315 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
316 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
317 printf("NullExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
318 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
319 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
320 if (this->type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
321 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
322 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
323 if (type->ty == Tpointer && type->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
324 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
325 if (t->ty == Ttypedef)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
326 t = ((TypeTypedef *)t)->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
327 if (t->ty == Tpointer || t->ty == Tarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
328 t->ty == Taarray || t->ty == Tclass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
329 t->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
330 return committed ? MATCHconvert : MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
331 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
332 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
334
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
335 MATCH StringExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
336 { MATCH m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
337
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
338 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
339 printf("StringExp::implicitConvTo(this=%s, committed=%d, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
340 toChars(), committed, type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
341 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
342 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
343 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
344 if (!committed && t->ty == Tpointer && t->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
345 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
346 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
347 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
348 if (type->ty == Tsarray || type->ty == Tarray || type->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
350 if (type->next->ty == Tchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
351 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
352 switch (t->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
354 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
355 if (type->ty == Tsarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
356 ((TypeSArray *)type)->dim->toInteger() !=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
357 ((TypeSArray *)t)->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
358 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
359 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
360 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
361 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
362 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
363 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
364 if (t->next->ty == Tchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
365 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
366 else if (t->next->ty == Twchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
367 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
368 else if (t->next->ty == Tdchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
369 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
370 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
372 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
374 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
375 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
376 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
377 m = (MATCH)type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
378 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
379 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
380 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
382
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
383 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
384 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
385 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
386
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
387 MATCH ArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
388 { MATCH result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
389
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
390 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
391 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
392 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
393 (typeb->ty == Tarray || typeb->ty == Tsarray))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
394 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
395 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
396 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
397 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
398 result = MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
401 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
402 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
403 MATCH m = (MATCH)e->implicitConvTo(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
404 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
405 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
406 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
407 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
408 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
409 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
410 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
411 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
412 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
414
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
415 MATCH AssocArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
416 { MATCH result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
417
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
418 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
419 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
420 if (tb->ty == Taarray && typeb->ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
421 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
422 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
423 { Expression *e = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
424 MATCH m = (MATCH)e->implicitConvTo(((TypeAArray *)tb)->key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
425 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
426 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
427 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
428 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
429 e = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
430 m = (MATCH)e->implicitConvTo(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
431 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
432 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
433 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
434 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
435 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
436 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
437 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
438 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
439 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
440 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
441
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
442 MATCH AddrExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
443 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
444 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
445 printf("AddrExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
446 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
447 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
448 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
449
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
450 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
451 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
453 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
454 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
455 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
456 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
457 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
458
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
459 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
460 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
461 t->ty == Tpointer && t->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
462 e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
463 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
464 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
465 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
466 if (f && f->overloadExactMatch(t->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
467 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
468 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
469 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
470 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
471 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
472 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
473
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
474 MATCH SymOffExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
475 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
476 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
477 printf("SymOffExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
478 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
479 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
480 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
482 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
483 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
484
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
485 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
486 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
487 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
488 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
489
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
490 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
491 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
492 t->ty == Tpointer && t->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
493 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
494 f = var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
495 if (f && f->overloadExactMatch(t->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
496 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
497 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
498 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
499 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
500 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
501 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
503 MATCH DelegateExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
504 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
505 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
506 printf("DelegateExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
507 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
508 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
509 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
510
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
511 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
512
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
513 if (result == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
514 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
515 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
516 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
517
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
518 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
519 if (type->ty == Tdelegate && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
520 t->ty == Tdelegate && t->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
521 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
522 if (func && func->overloadExactMatch(t->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
523 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
524 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
525 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
526 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
527 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
529 MATCH CondExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
530 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
531 MATCH m1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
532 MATCH m2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
533
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
534 m1 = e1->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
535 m2 = e2->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
536
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
537 // Pick the worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
538 return (m1 < m2) ? m1 : m2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
539 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
540
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
542 /* ==================== castTo ====================== */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
544 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
545 * Do an explicit cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
546 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
547
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
548 Expression *Expression::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
549 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
550 //printf("Expression::castTo(this=%s, t=%s)\n", toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
551 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
552 printf("Expression::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
553 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
554 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
555 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
556 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
557 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
558 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
559 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
560 if (tb != typeb)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
561 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
562 // Do (type *) cast of (type [dim])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
563 if (tb->ty == Tpointer &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
564 typeb->ty == Tsarray
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
565 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
566 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
567 //printf("Converting [dim] to *\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
568
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
569 if (typeb->size(loc) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
570 e = new NullExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
571 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
572 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
574 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
575 else if (tb->ty == Tdelegate && type->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
576 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
577 TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
578 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
579 return toDelegate(sc, tf->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
580 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
581 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
582 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
583 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
584 e = new CastExp(loc, e, tb);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
585 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
586 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
587 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
588 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
589 e = e->copy(); // because of COW for assignment to e->type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
590 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
591 assert(e != this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
592 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
593 //printf("Returning: %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
594 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
595 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
596
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
597
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
598 Expression *RealExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
599 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
600 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
601 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
602 if ((type->isreal() && t->isreal()) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
603 (type->isimaginary() && t->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
604 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
605 { e = copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
606 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
607 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
608 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
609 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
610 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
611 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
612 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
614
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
615 Expression *ComplexExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
616 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
617 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
618 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
619 if (type->iscomplex() && t->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
620 { e = copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
621 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
622 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
623 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
624 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
625 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
626 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
627 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
628
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
629
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
630 Expression *NullExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
631 { NullExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
632 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
633
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
634 //printf("NullExp::castTo(t = %p)\n", t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
635 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
636 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
637 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
638 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
639 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
640 e = (NullExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
641 e->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
642 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
643 e->type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
644 if (tb != e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
645 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
646 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
647 if (e->type->ty == Tpointer && e->type->nextOf()->ty == Tvoid &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
648 (tb->ty == Tpointer || tb->ty == Tarray || tb->ty == Taarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
649 tb->ty == Tdelegate))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
650 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
651 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
652 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
653 { TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
654 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
655
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
656 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
657 !(tf->arguments && tf->arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
658 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
659 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
660 return Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
661 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
662 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
663 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
664 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
665 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
666 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
667 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
668 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
669 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
670 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
671 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
672 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
673
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
674 Expression *StringExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
675 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
676 /* This follows copy-on-write; any changes to 'this'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
677 * will result in a copy.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
678 * The this->string member is considered immutable.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
679 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
680 StringExp *se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
681 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
682 int copied = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
683
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
684 //printf("StringExp::castTo(t = %s), '%s' committed = %d\n", t->toChars(), toChars(), committed);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
685
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
686 if (!committed && t->ty == Tpointer && t->nextOf()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
687 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
688 error("cannot convert string literal to void*");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
689 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
690
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
691 se = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
692 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
693 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
694 se->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
695 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
696 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
697
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
698 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
699 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
700 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
702
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
703 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
704 //printf("\ttype = %s\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
705 if (tb->ty == Tdelegate && type->toBasetype()->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
706 return Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
707
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
708 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
709 if (typeb == tb)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
710 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
711 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
712 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
713 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
714 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
715 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
716 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
717 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
718
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
719 if (tb->ty != Tsarray && tb->ty != Tarray && tb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
720 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
721 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
722 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
723 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
724 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
725 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
726 if (typeb->ty != Tsarray && typeb->ty != Tarray && typeb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
727 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
728 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
729 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
730 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
731 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
732 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
733
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
734 if (typeb->nextOf()->size() == tb->nextOf()->size())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
735 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
736 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
737 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
738 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
740 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
741 goto L2; // handle possible change in static array dimension
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
742 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
743 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
744 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
745
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
746 if (committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
747 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
748
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
749 #define X(tf,tt) ((tf) * 256 + (tt))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
750 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
751 OutBuffer buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
752 size_t newlen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
753 int tfty = typeb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
754 int ttty = tb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
755 switch (X(tfty, ttty))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
756 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
757 case X(Tchar, Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
758 case X(Twchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
759 case X(Tdchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
760 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
761
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
762 case X(Tchar, Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
763 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
764 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
765 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
766 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
767 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
768 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
769 buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
770 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
771 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
772 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
773 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
774
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
775 case X(Tchar, Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
776 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
777 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
778 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
779 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
780 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
781 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
782 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
783 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
784 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
785 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
786
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
787 case X(Twchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
788 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
789 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
790 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
791 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
792 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
793 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
794 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
795 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
796 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
797 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
798 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
799
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
800 case X(Twchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
801 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
802 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
803 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
804 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
805 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
806 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
807 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
808 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
809 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
810 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
811
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
812 case X(Tdchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
813 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
814 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
815 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
816 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
817 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
818 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
819 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
820 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
821 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
822 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
823 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
824 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
825
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
826 case X(Tdchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
827 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
828 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
829 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
830 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
831 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
832 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
833 buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
834 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
835 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
836 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
837 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
838 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
839
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
840 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
841 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
842 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
843 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
844 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
845 se->string = buffer.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
846 se->len = newlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
847 se->sz = tb->nextOf()->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
848 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
849
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
850 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
851 assert(typeb->nextOf()->size() != tb->nextOf()->size());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
852 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
853 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
854 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
855 #undef X
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
856 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
857 assert(copied);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
858
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
859 // See if need to truncate or extend the literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
860 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
861 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
862 int dim2 = ((TypeSArray *)tb)->dim->toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
863
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
864 //printf("dim from = %d, to = %d\n", se->len, dim2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
865
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
866 // Changing dimensions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
867 if (dim2 != se->len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
868 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
869 // Copy when changing the string literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
870 unsigned newsz = se->sz;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
871 void *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
872 int d;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
873
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
874 d = (dim2 < se->len) ? dim2 : se->len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
875 s = (unsigned char *)mem.malloc((dim2 + 1) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
876 memcpy(s, se->string, d * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
877 // Extend with 0, add terminating 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
878 memset((char *)s + d * newsz, 0, (dim2 + 1 - d) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
879 se->string = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
880 se->len = dim2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
881 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
882 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
883 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
884 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
885
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
886 Lcast:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
887 Expression *e = new CastExp(loc, se, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
888 e->type = t; // so semantic() won't be run on e
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
889 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
890 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
891
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
892 Expression *AddrExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
893 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
894 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
895
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
896 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
897 printf("AddrExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
898 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
899 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
900 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
901
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
902 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
903 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
904 if (tb != type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
905 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
906 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
907 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
908 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
910 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
911 tb->ty == Tpointer && tb->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
912 e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
913 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
914 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
915 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
916 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
917 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
918 f = f->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
919 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
920 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
921 e = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
922 e->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
923 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
924 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
925 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
926 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
927 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
928 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
929 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
930 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
931 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
932 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
933 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
934
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
936 Expression *TupleExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
937 { TupleExp *e = (TupleExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
938 e->exps = (Expressions *)exps->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
939 for (size_t i = 0; i < e->exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
940 { Expression *ex = (Expression *)e->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
941 ex = ex->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
942 e->exps->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
943 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
944 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
945 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
946
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
947
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
948 Expression *ArrayLiteralExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
949 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
950 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
951 printf("ArrayLiteralExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
952 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
953 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
954 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
955 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
956 ArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
957 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
958 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
959 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
960 (typeb->ty == Tarray || typeb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
961 // Not trying to convert non-void[] to void[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
962 !(tb->nextOf()->toBasetype()->ty == Tvoid && typeb->nextOf()->toBasetype()->ty != Tvoid))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
963 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
964 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
965 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
966 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
967 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
968 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
969
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
970 e = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
971 e->elements = (Expressions *)elements->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
972 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
973 { Expression *ex = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
974 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
975 e->elements->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
976 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
977 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
978 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
979 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
980 if (tb->ty == Tpointer && typeb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
981 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
982 e = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
983 e->type = typeb->nextOf()->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
984 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
985 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
986 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
987 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
988
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
989 Expression *AssocArrayLiteralExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
990 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
991 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
992 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
993 AssocArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
994 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
995 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
996 if (tb->ty == Taarray && typeb->ty == Taarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
997 tb->nextOf()->toBasetype()->ty != Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
998 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
999 e = (AssocArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1000 e->keys = (Expressions *)keys->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1001 e->values = (Expressions *)values->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1002 assert(keys->dim == values->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1003 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1004 { Expression *ex = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1005 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1006 e->values->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1007
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1008 ex = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1009 ex = ex->castTo(sc, ((TypeAArray *)tb)->index);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1010 e->keys->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1011 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1012 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1013 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1014 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1015 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1016 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1017 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1018
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1019
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1020 Expression *SymOffExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1021 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1022 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1023
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1024 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1025 printf("SymOffExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1026 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1027 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1028 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1029
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1030 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1031 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1032 if (tb != type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1033 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1034 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1035 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1036
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1037 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1038 tb->ty == Tpointer && tb->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1039 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1040 f = var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1041 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1042 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1043 f = f->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1044 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1045 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1046 e = new SymOffExp(loc, f, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1047 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1048 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1049 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1050 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1051 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1052 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1053 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1054 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1055 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1056 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1057
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1058 Expression *DelegateExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1059 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1060 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1061 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1062 printf("DelegateExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1063 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1064 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1065 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1066 static char msg[] = "cannot form delegate due to covariant return type";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1067
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1068 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1069 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1070 if (tb != type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1071 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1072 // Look for delegates to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1073 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1074
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1075 if (type->ty == Tdelegate && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1076 tb->ty == Tdelegate && tb->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1077 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1078 if (func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1079 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1080 f = func->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1081 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1082 { int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1083 if (f->tintro && f->tintro->next->isBaseOf(f->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1084 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1085 e = new DelegateExp(loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1086 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1087 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1088 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1089 if (func->tintro)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1090 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1091 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1092 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1093 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1094 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1095 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1096 { int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1097
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1098 if (func->tintro && func->tintro->next->isBaseOf(func->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1099 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1100 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1101 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1102 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1103 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1104
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1105 Expression *CondExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1106 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1107 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1108
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1109 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1110 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1111 if (1 || e1->op == TOKstring || e2->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1112 { e = new CondExp(loc, econd, e1->castTo(sc, t), e2->castTo(sc, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1113 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1114 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1115 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1116 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1117 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1118 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1119 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1121 /* ==================== ====================== */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1122
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1123 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1124 * Scale addition/subtraction to/from pointer.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1125 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1126
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1127 Expression *BinExp::scaleFactor(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1128 { d_uns64 stride;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1129 Type *t1b = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1130 Type *t2b = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1132 if (t1b->ty == Tpointer && t2b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1133 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1134 // Replace (ptr + int) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1135 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1136
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1137 stride = t1b->next->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1138 if (!t->equals(t2b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1139 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1140 // LLVMDC: llvm uses typesafe pointer arithmetic
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1141 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1142 if (t1b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1143 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1144 // This perhaps should be done by rewriting as &p[i]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1145 // and letting back end do it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1146 e2 = new UshrExp(loc, e2, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1147 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1148 e2 = new MulExp(loc, e2, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1149 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1150 e2->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1151 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1152 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1153 else if (t2b->ty == Tpointer && t1b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1154 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1155 // Replace (int + ptr) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1156 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1157 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1158
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1159 stride = t2b->next->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1160 if (!t->equals(t1b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1161 e = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1162 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1163 e = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1164 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1165 if (t2b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1166 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1167 e = new UshrExp(loc, e, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1168 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1169 e = new MulExp(loc, e, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1170 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1171 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1172 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1173 e1 = e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1174 e2 = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1175 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1176 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1177 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1179 /************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1180 * Bring leaves to common type.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1181 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1183 Expression *BinExp::typeCombine(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1184 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1185 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1186 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1187 Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1188 TY ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1189
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1190 //printf("BinExp::typeCombine()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1191 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1193 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1194 e2 = e2->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1196 // BUG: do toBasetype()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1197 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1198 t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1199 assert(t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1200
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1201 //if (t1) printf("\tt1 = %s\n", t1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1202 //if (t2) printf("\tt2 = %s\n", t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1203 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1204 if (!t2) printf("\te2 = '%s'\n", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1205 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1206 assert(t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1207
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1208 Type *t1b = t1->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1209 Type *t2b = t2->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1211 ty = (TY)Type::impcnvResult[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1212 if (ty != Terror)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1213 { TY ty1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1214 TY ty2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1216 ty1 = (TY)Type::impcnvType1[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1217 ty2 = (TY)Type::impcnvType2[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1219 if (t1b->ty == ty1) // if no promotions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1220 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1221 if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1222 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1223 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1224 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1225 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1228 if (t1b == t2b)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1229 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1230 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1231 type = t1b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1232 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1233 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1235
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1236 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1237 type = Type::basic[ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1239 t1 = Type::basic[ty1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1240 t2 = Type::basic[ty2];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1241 e1 = e1->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1242 e2 = e2->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1243 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1244 if (type != Type::basic[ty])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1245 { t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1246 type = Type::basic[ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1247 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1248 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1249 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1250 //printf("after typeCombine():\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1251 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1252 //printf("ty = %d, ty1 = %d, ty2 = %d\n", ty, ty1, ty2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1253 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1255
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1256 t = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1257 if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1258 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1259 if ((t1->ty == Tstruct || t1->ty == Tclass) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1260 (op == TOKmin || op == TOKadd))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1261 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1262 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1263 else if (t1->isintegral() && t2->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1264 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1265 printf("t1 = %s, t2 = %s\n", t1->toChars(), t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1266 int sz1 = t1->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1267 int sz2 = t2->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1268 int sign1 = t1->isunsigned() == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1269 int sign2 = t2->isunsigned() == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1270
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1271 if (sign1 == sign2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1272 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1273 if (sz1 < sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1274 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1275 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1276 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1278 if (!sign1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1279 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1280 if (sz1 >= sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1281 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1282 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1283 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1284 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1285 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1286 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1287 if (sz2 >= sz1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1288 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1289 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1290 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1291 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1292 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1293 else if (t1->ty == Tpointer && t2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1294 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1295 // Bring pointers to compatible type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1296 Type *t1n = t1->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1297 Type *t2n = t2->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1298
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1299 //t1->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1300 //t2->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1301 //if (t1n == t2n) *(char *)0 = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1302 assert(t1n != t2n);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1303 if (t1n->ty == Tvoid) // pointers to void are always compatible
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1304 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1305 else if (t2n->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1306 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1307 else if (t1n->ty == Tclass && t2n->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1308 { ClassDeclaration *cd1 = t1n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1309 ClassDeclaration *cd2 = t2n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1310 int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1312 if (cd1->isBaseOf(cd2, &offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1313 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1314 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1315 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1316 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1317 else if (cd2->isBaseOf(cd1, &offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1318 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1319 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1320 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1321 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1322 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1323 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1324 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1325 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1326 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1327 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1329 else if ((t1->ty == Tsarray || t1->ty == Tarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1330 e2->op == TOKnull && t2->ty == Tpointer && t2->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1331 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1332 goto Lx1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1334 else if ((t2->ty == Tsarray || t2->ty == Tarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1335 e1->op == TOKnull && t1->ty == Tpointer && t1->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1336 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1337 goto Lx2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1339 else if ((t1->ty == Tsarray || t1->ty == Tarray) && t1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1340 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1341 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1342 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1343 else if ((t2->ty == Tsarray || t2->ty == Tarray) && t2->implicitConvTo(t1))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1344 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1345 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1346 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1347 else if (t1->ty == Tclass || t2->ty == Tclass)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1348 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1349 while (1)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1350 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1351 int i1 = e2->implicitConvTo(t1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1352 int i2 = e1->implicitConvTo(t2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1353
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1354 if (i1 && i2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1355 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1356 // We have the case of class vs. void*, so pick class
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1357 if (t1->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1358 i1 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1359 else if (t2->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1360 i2 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1361 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1362
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1363 if (i2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1364 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1365 goto Lt2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1366 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1367 else if (i1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1369 goto Lt1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1370 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1371 else if (t1->ty == Tclass && t2->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1372 { TypeClass *tc1 = (TypeClass *)t1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1373 TypeClass *tc2 = (TypeClass *)t2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1374
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1375 /* Pick 'tightest' type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1376 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1377 ClassDeclaration *cd1 = tc1->sym->baseClass;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1378 ClassDeclaration *cd2 = tc1->sym->baseClass;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1379
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1380 if (cd1 && cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1381 { t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1382 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1383 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1384 else if (cd1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1385 t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1386 else if (cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1387 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1388 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1389 goto Lincompatible;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1390 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1391 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1392 goto Lincompatible;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1393 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1395 else if ((e1->op == TOKstring || e1->op == TOKnull) && e1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1396 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1397 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1398 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1399 //else if (e2->op == TOKstring) { printf("test2\n"); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1400 else if ((e2->op == TOKstring || e2->op == TOKnull) && e2->implicitConvTo(t1))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1401 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1402 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1403 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1404 else if (t1->ty == Tsarray && t2->ty == Tsarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1405 e2->implicitConvTo(t1->next->arrayOf()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1406 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1407 Lx1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1408 t = t1->next->arrayOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1409 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1410 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1411 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1412 else if (t1->ty == Tsarray && t2->ty == Tsarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1413 e1->implicitConvTo(t2->next->arrayOf()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1414 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1415 Lx2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1416 t = t2->next->arrayOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1417 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1418 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1419 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1420 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1421 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1422 Lincompatible:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1423 incompatibleTypes();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1424 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1425 Lret:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1426 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1427 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1428 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1429 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1430
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1431
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1432 Lt1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1433 e2 = e2->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1434 t = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1435 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1436
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1437 Lt2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1438 e1 = e1->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1439 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1440 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1441 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1442
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1443 /***********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1444 * Do integral promotions (convertchk).
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1445 * Don't convert <array of> to <pointer to>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1446 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1447
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1448 Expression *Expression::integralPromotions(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1449 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1450
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1451 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1452 switch (type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1453 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1454 case Tvoid:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1455 error("void has no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1456 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1457
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1458 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1459 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1460 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1461 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1462 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1463 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1464 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1465 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1466 e = e->castTo(sc, Type::tint32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1467 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1468
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1469 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1470 e = e->castTo(sc, Type::tuns32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1471 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1472 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1473 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1474 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1475