annotate dmd/cast.c @ 948:780530d1cad3

Revert templates to old behavior. While emitting a template instantiation only once is good for compile times and binary sizes, it doesn't work with linkonce linkage as inlined function bodies could be discarded. Since we don't want to inhibit inlining, templates are reverted to the previous behavior, where an instantiation is emitted for each module using it. In the future, a custom inlining pass may allow us to switch back to common/weak linkage and reenable smart template instance emission.
author Christian Kamm <kamm incasoftware de>
date Sun, 08 Feb 2009 21:44:46 +0100
parents bc982f1ad106
children b30fe7e1dbb9
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))
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
36 { TY tyfrom = type->toBasetype()->ty;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
37 TY tyto = t->toBasetype()->ty;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
38 if (global.params.warnings &&
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
39 Type::impcnvWarn[tyfrom][tyto] &&
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
40 op != TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
41 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
42 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
43
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
44 if (e->op == TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
45 return e->implicitCastTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
46
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
47 if (tyfrom == Tint32 &&
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
48 (op == TOKadd || op == TOKmin ||
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
49 op == TOKand || op == TOKor || op == TOKxor)
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
50 )
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
51 {
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
52 /* This is really only a semi-kludge fix,
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
53 * we really should look at the operands of op
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
54 * and see if they are narrower types.
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
55 * For example, b=b|b and b=b|7 and s=b+b should be allowed,
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
56 * but b=b|i should be an error.
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
57 */
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
58 ;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
59 }
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
60 else
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
61 {
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
62 warning("%s: implicit conversion of expression (%s) of type %s to %s can cause loss of data",
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
63 loc.toChars(), toChars(), type->toChars(), t->toChars());
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
64 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
65 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
66 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
67 if (match == MATCHconst && t == type->constOf())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
68 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
69 Expression *e = copy();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
70 e->type = t;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
71 return e;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
72 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
73 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
74 return castTo(sc, t);
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
77 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
78 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
79 return e->implicitCastTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
80
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
81 #if 0
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
82 printf("ty = %d\n", type->ty);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
83 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
84 type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
85 printf("to:\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
86 t->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
87 printf("%p %p type: %s to: %s\n", type->deco, t->deco, type->deco, t->deco);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
88 //printf("%p %p %p\n", type->nextOf()->arrayOf(), type, t);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
89 fflush(stdout);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
90 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
91 if (!t->deco)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
92 { /* Can happen with:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
93 * enum E { One }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
94 * class A
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
95 * { static void fork(EDG dg) { dg(E.One); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
96 * alias void delegate(E) EDG;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
97 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
98 * Should eventually make it work.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
99 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
100 error("forward reference to type %s", t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
101 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
102 else if (t->reliesOnTident())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
103 error("forward reference to type %s", t->reliesOnTident()->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
104
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
105 error("cannot implicitly convert expression (%s) of type %s to %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
106 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
107 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
109
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
110 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
111 * Return !=0 if we can implicitly convert this to type t.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
112 * Don't do the actual cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
113 */
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 MATCH Expression::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
116 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
117 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
118 printf("Expression::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
119 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
120 #endif
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
121 //static int nest; if (++nest == 10) halt();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
122 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
123 { error("%s is not an expression", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
124 type = Type::terror;
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 if (t->ty == Tbit && isBit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
127 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
128 Expression *e = optimize(WANTvalue | WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
129 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
130 { //printf("optimzed to %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
131 return e->implicitConvTo(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 MATCH match = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
134 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
135 return match;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
136 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
137 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
138 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
139 { TypeDelegate *td = (TypeDelegate *)tb;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
140 TypeFunction *tf = (TypeFunction *)td->nextOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
141
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
142 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
143 !(tf->arguments && tf->arguments->dim)
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 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
146 match = type->implicitConvTo(tf->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
147 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
148 return match;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
149 if (tf->nextOf()->toBasetype()->ty == Tvoid)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
150 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
151 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
152 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
153 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
154 return MATCHnomatch;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
157
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
158 MATCH IntegerExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
159 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
160 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
161 printf("IntegerExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
162 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
163 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
164 if (type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
165 return MATCHexact;
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 enum TY ty = type->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
168 enum TY toty = t->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
169
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
170 if (type->implicitConvTo(t) == MATCHnomatch && t->ty == Tenum)
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 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
173 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
174
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
175 switch (ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
176 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
177 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
178 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
179 value &= 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
180 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
181 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
183 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
184 value = (signed char)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
185 ty = Tint32;
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 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
189 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
190 value &= 0xFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
191 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
192 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
193
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
194 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
195 value = (short)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
196 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
197 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
198
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
199 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
200 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
201 value &= 0xFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
202 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
203 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
204
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
205 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
206 value = (int)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
207 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
209 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
210 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
211 value &= 0xFFFFFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
212 ty = Tuns32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
213 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
214
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
215 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
216 break;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
219 // Only allow conversion if no change in value
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
220 switch (toty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
221 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
222 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
223 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
224 if ((value & 1) != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
225 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
226 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
227
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
228 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
229 if ((signed char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
230 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
231 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
232
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
233 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
234 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
235 //printf("value = %llu %llu\n", (integer_t)(unsigned char)value, value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
236 if ((unsigned char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
237 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
238 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
239
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
240 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
241 if ((short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
242 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
243 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
244
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
245 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
246 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
247 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
248 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
249
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
250 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
251 if (ty == Tuns32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
252 {
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 else if ((int)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
255 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
256 goto Lyes;
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 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
259 if (ty == Tint32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
260 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
261 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
262 else if ((unsigned)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
263 goto Lno;
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 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
267 if (value > 0x10FFFFUL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
268 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
269 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
270
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
271 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
272 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
273 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
274 goto Lyes;
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 case Tfloat32:
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 volatile float f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
279 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
280 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
281 f = (float)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
282 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
283 goto Lno;
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 else
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 f = (float)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
288 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
289 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
291 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
292 }
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 case Tfloat64:
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 volatile double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
297 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
298 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
299 f = (double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
300 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
301 goto Lno;
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 else
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 f = (double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
306 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
307 goto Lno;
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 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
310 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
312 case Tfloat80:
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 volatile long double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
315 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
316 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
317 f = (long double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
318 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
319 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
321 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
322 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
323 f = (long double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
324 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
325 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
326 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
327 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
329 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
330 return Expression::implicitConvTo(t);
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 Lyes:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
333 //printf("MATCHconvert\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
334 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
335
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
336 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
337 //printf("MATCHnomatch\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
338 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
339 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
340
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
341 MATCH NullExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
342 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
343 #if 0
717
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
344 printf("NullExp::implicitConvTo(this=%s, type=%s, t=%s, committed = %d)\n",
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
345 toChars(), type->toChars(), t->toChars(), committed);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
346 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
347 if (this->type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
348 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
349 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
350 if (type->ty == Tpointer && type->next->ty == Tvoid)
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 if (t->ty == Ttypedef)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
353 t = ((TypeTypedef *)t)->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
354 if (t->ty == Tpointer || t->ty == Tarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
355 t->ty == Taarray || t->ty == Tclass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
356 t->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
357 return committed ? MATCHconvert : MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
358 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
359 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
360 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
361
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
362 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
363 MATCH StructLiteralExp::implicitConvTo(Type *t)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
364 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
365 #if 0
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
366 printf("StructLiteralExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
367 toChars(), type->toChars(), t->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
368 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
369 MATCH m = Expression::implicitConvTo(t);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
370 if (m != MATCHnomatch)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
371 return m;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
372 if (type->ty == t->ty && type->ty == Tstruct &&
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
373 ((TypeStruct *)type)->sym == ((TypeStruct *)t)->sym)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
374 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
375 m = MATCHconst;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
376 for (int i = 0; i < elements->dim; i++)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
377 { Expression *e = (Expression *)elements->data[i];
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
378 Type *te = e->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
379 if (t->mod == 0)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
380 te = te->mutableOf();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
381 else
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
382 { assert(t->mod == MODinvariant);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
383 te = te->invariantOf();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
384 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
385 MATCH m2 = e->implicitConvTo(te);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
386 //printf("\t%s => %s, match = %d\n", e->toChars(), te->toChars(), m2);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
387 if (m2 < m)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
388 m = m2;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
389 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
390 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
391 return m;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
392 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
393 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
394
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
395 MATCH StringExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
396 { MATCH m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
397
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
398 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
399 printf("StringExp::implicitConvTo(this=%s, committed=%d, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
400 toChars(), committed, type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
401 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
402 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
403 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
404 if (!committed && t->ty == Tpointer && t->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
405 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
406 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
408 if (type->ty == Tsarray || type->ty == Tarray || type->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
409 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
410 if (type->next->ty == Tchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
411 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
412 switch (t->ty)
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 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
415 if (type->ty == Tsarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
416 ((TypeSArray *)type)->dim->toInteger() !=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
417 ((TypeSArray *)t)->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
418 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
419 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
420 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
421 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
422 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
423 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
424 if (t->next->ty == Tchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
425 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
426 else if (t->next->ty == Twchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
427 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
428 else if (t->next->ty == Tdchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
429 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
430 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
431 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
433 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
434 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
435 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
436 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
437 m = (MATCH)type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
438 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
439 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
440 return m;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
443 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
444 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
447 MATCH ArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
448 { MATCH result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
449
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
450 #if 0
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
451 printf("ArrayLiteralExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
452 toChars(), type->toChars(), t->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
453 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
454 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
455 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
456 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
457 (typeb->ty == Tarray || typeb->ty == Tsarray))
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 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
460 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
461 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
462 result = MATCHnomatch;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
465 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
466 { Expression *e = (Expression *)elements->data[i];
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
467 MATCH m = (MATCH)e->implicitConvTo(tb->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
468 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
469 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
470 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
471 break; // no need to check for worse
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 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
474 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
475 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
476 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
477 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
478
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
479 MATCH AssocArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
480 { MATCH result = MATCHexact;
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 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
483 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
484 if (tb->ty == Taarray && typeb->ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
485 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
486 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
487 { Expression *e = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
488 MATCH m = (MATCH)e->implicitConvTo(((TypeAArray *)tb)->key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
489 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
490 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
491 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
492 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
493 e = (Expression *)values->data[i];
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
494 m = (MATCH)e->implicitConvTo(tb->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
495 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
496 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
497 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
498 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
499 }
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
503 return Expression::implicitConvTo(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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
506 MATCH AddrExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
507 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
508 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
509 printf("AddrExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
510 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
511 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
512 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
513
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
514 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
515 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
516
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
517 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
518 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
519 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
520 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
521 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
522
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
523 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
524 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
525 t->ty == Tpointer && t->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
526 e1->op == TOKvar)
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 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
529 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
530 if (f && f->overloadExactMatch(t->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
531 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
532 }
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 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
535 return result;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
538 MATCH SymOffExp::implicitConvTo(Type *t)
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 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
541 printf("SymOffExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
542 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
543 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
544 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
545
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
546 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
547 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
548
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
549 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
550 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
551 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
552 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
553
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
554 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
555 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
556 t->ty == Tpointer && t->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
557 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
558 f = var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
559 if (f && f->overloadExactMatch(t->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
560 result = MATCHexact;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
563 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
564 return result;
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 MATCH DelegateExp::implicitConvTo(Type *t)
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 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
570 printf("DelegateExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
571 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
572 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
573 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
575 result = type->implicitConvTo(t);
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 if (result == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
578 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
579 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
580 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
581
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
582 t = t->toBasetype();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
583 if (type->ty == Tdelegate && type->nextOf()->ty == Tfunction &&
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
584 t->ty == Tdelegate && t->nextOf()->ty == Tfunction)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
585 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
586 if (func && func->overloadExactMatch(t->nextOf()))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
587 result = MATCHexact;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
590 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
591 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
593 MATCH CondExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
594 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
595 MATCH m1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
596 MATCH m2;
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 m1 = e1->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
599 m2 = e2->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
600
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
601 // Pick the worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
602 return (m1 < m2) ? m1 : m2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
603 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
606 /* ==================== castTo ====================== */
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 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
609 * Do an explicit cast.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
612 Expression *Expression::castTo(Scope *sc, Type *t)
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 //printf("Expression::castTo(this=%s, t=%s)\n", toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
615 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
616 printf("Expression::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
617 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
618 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
619 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
620 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
621 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
622 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
623 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
624 if (tb != typeb)
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 // Do (type *) cast of (type [dim])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
627 if (tb->ty == Tpointer &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
628 typeb->ty == Tsarray
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 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
631 //printf("Converting [dim] to *\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
632
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
633 if (typeb->size(loc) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
634 e = new NullExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
635 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
636 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
637 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
638 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
639 else if (tb->ty == Tdelegate && type->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
640 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
641 TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
642 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
643 return toDelegate(sc, tf->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
644 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
645 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
646 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
647 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
648 e = new CastExp(loc, e, tb);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
649 }
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
652 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
653 e = e->copy(); // because of COW for assignment to e->type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
654 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
655 assert(e != this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
656 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
657 //printf("Returning: %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
658 return e;
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
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 Expression *RealExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
663 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
664 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
665 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
666 if ((type->isreal() && t->isreal()) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
667 (type->isimaginary() && t->isimaginary())
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 { e = copy();
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
672 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
673 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
674 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
675 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
676 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
677
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
678
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
679 Expression *ComplexExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
680 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
681 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
682 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
683 if (type->iscomplex() && t->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
684 { e = copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
685 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
686 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
687 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
688 e = Expression::castTo(sc, t);
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 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
691 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
692
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
693
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
694 Expression *NullExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
695 { NullExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
696 Type *tb;
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 //printf("NullExp::castTo(t = %p)\n", t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
699 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
700 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
701 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
702 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
703 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
704 e = (NullExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
705 e->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
706 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
707 e->type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
708 if (tb != e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
709 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
710 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
711 if (e->type->ty == Tpointer && e->type->nextOf()->ty == Tvoid &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
712 (tb->ty == Tpointer || tb->ty == Tarray || tb->ty == Taarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
713 tb->ty == Tdelegate))
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 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
716 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
717 { TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
718 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
719
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
720 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
721 !(tf->arguments && tf->arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
722 )
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 return Expression::castTo(sc, t);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
727 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
728 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
729 else
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 return e->Expression::castTo(sc, t);
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 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
735 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
736 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
737
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
738 Expression *StringExp::castTo(Scope *sc, Type *t)
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 /* This follows copy-on-write; any changes to 'this'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
741 * will result in a copy.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
742 * The this->string member is considered immutable.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
743 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
744 StringExp *se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
745 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
746 int copied = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
747
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
748 //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
749
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
750 if (!committed && t->ty == Tpointer && t->nextOf()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
751 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
752 error("cannot convert string literal to void*");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
753 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
754
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
755 se = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
756 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
757 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
758 se->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
759 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
760 }
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 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
763 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
764 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
765 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
766
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
767 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
768 //printf("\ttype = %s\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
769 if (tb->ty == Tdelegate && type->toBasetype()->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
770 return Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
771
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
772 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
773 if (typeb == tb)
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 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
776 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
777 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
778 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
779 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
780 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
781 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
782
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
783 if (tb->ty != Tsarray && tb->ty != Tarray && tb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
784 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
785 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
786 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
787 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
788 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
789 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
790 if (typeb->ty != Tsarray && typeb->ty != Tarray && typeb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
791 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
792 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
793 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
794 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
795 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
796 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
797
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
798 if (typeb->nextOf()->size() == tb->nextOf()->size())
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 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
801 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
802 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
803 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
804 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
805 goto L2; // handle possible change in static array dimension
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
806 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
807 return se;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
810 if (committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
811 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
812
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
813 #define X(tf,tt) ((tf) * 256 + (tt))
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 OutBuffer buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
816 size_t newlen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
817 int tfty = typeb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
818 int ttty = tb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
819 switch (X(tfty, ttty))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
820 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
821 case X(Tchar, Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
822 case X(Twchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
823 case X(Tdchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
824 break;
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(Tchar, Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
827 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
828 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
829 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
830 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
831 error("%s", p);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
835 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
836 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
837 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
838
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
839 case X(Tchar, Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
840 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
841 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
842 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
843 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
844 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
845 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
846 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
847 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
848 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
849 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
850
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
851 case X(Twchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
852 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
853 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
854 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
855 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
856 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
857 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
858 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
859 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
860 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
861 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
862 goto L1;
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 case X(Twchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
865 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
866 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
867 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
868 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
869 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
870 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
871 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
872 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
873 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
874 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
875
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
876 case X(Tdchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
877 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
878 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
879 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
880 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
881 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
882 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
883 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
884 newlen++;
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 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
887 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
888 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
889
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
890 case X(Tdchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
891 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
892 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
893 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
894 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
895 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
896 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
897 buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
898 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
899 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
900 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
901 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
902 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
903
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
904 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
905 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
906 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
907 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
908 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
909 se->string = buffer.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
910 se->len = newlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
911 se->sz = tb->nextOf()->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
912 break;
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 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
915 assert(typeb->nextOf()->size() != tb->nextOf()->size());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
916 goto Lcast;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
919 #undef X
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
920 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
921 assert(copied);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
922
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
923 // See if need to truncate or extend the literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
924 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
925 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
926 int dim2 = ((TypeSArray *)tb)->dim->toInteger();
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 //printf("dim from = %d, to = %d\n", se->len, dim2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
929
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
930 // Changing dimensions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
931 if (dim2 != se->len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
932 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
933 // Copy when changing the string literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
934 unsigned newsz = se->sz;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
935 void *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
936 int d;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
937
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
938 d = (dim2 < se->len) ? dim2 : se->len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
939 s = (unsigned char *)mem.malloc((dim2 + 1) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
940 memcpy(s, se->string, d * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
941 // Extend with 0, add terminating 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
942 memset((char *)s + d * newsz, 0, (dim2 + 1 - d) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
943 se->string = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
944 se->len = dim2;
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 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
948 return se;
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 Lcast:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
951 Expression *e = new CastExp(loc, se, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
952 e->type = t; // so semantic() won't be run on e
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
953 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
954 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
956 Expression *AddrExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
957 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
958 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
959
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
960 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
961 printf("AddrExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
962 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
963 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
964 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
966 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
967 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
968 if (tb != type)
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 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
971 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
972 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
973
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
974 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
975 tb->ty == Tpointer && tb->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
976 e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
977 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
978 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
979 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
980 if (f)
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 f = f->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
983 if (f)
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 e = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
986 e->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
987 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
988 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
989 return e;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
992 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
993 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
994 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
995 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
996 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
997 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1000 Expression *TupleExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1001 { TupleExp *e = (TupleExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1002 e->exps = (Expressions *)exps->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1003 for (size_t i = 0; i < e->exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1004 { Expression *ex = (Expression *)e->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1005 ex = ex->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1006 e->exps->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 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1009 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1010
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 Expression *ArrayLiteralExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1013 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1014 #if 0
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1015 printf("ArrayLiteralExp::castTo(this=%s, type=%s, => %s)\n",
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1016 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1017 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1018 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1019 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1020 ArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1021 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1022 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1023 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1024 (typeb->ty == Tarray || typeb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1025 // Not trying to convert non-void[] to void[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1026 !(tb->nextOf()->toBasetype()->ty == Tvoid && typeb->nextOf()->toBasetype()->ty != Tvoid))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1027 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1028 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1029 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1030 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1031 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1032 }
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 e = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1035 e->elements = (Expressions *)elements->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1036 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1037 { Expression *ex = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1038 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1039 e->elements->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1040 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1041 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1042 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1043 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1044 if (tb->ty == Tpointer && typeb->ty == Tsarray)
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 = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1047 e->type = typeb->nextOf()->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1049 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1050 return e->Expression::castTo(sc, t);
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1053 Expression *AssocArrayLiteralExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1054 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1055 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1056 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1057 AssocArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1058 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1059 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1060 if (tb->ty == Taarray && typeb->ty == Taarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1061 tb->nextOf()->toBasetype()->ty != Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1062 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1063 e = (AssocArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1064 e->keys = (Expressions *)keys->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1065 e->values = (Expressions *)values->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1066 assert(keys->dim == values->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1067 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1068 { Expression *ex = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1069 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1070 e->values->data[i] = (void *)ex;
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 ex = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1073 ex = ex->castTo(sc, ((TypeAArray *)tb)->index);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1074 e->keys->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1075 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1076 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1077 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1078 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1079 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1080 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1081 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1082
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1083 Expression *SymOffExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1084 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1085 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1086
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1087 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1088 printf("SymOffExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1089 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1090 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1091 Expression *e = this;
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 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1094 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1095 if (tb != type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1096 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1097 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1098 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1099
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1100 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1101 tb->ty == Tpointer && tb->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1102 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1103 f = var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1104 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1105 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1106 f = f->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1107 if (f)
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 e = new SymOffExp(loc, f, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1110 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1111 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1112 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1113 }
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 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1116 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1117 e->type = t;
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 Expression *DelegateExp::castTo(Scope *sc, Type *t)
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 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1124 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1125 printf("DelegateExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1126 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1127 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1128 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1129 static char msg[] = "cannot form delegate due to covariant return type";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1131 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1132 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1133 if (tb != type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1135 // Look for delegates to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1136 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1137
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1138 if (type->ty == Tdelegate && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1139 tb->ty == Tdelegate && tb->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1140 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1141 if (func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1142 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1143 f = func->overloadExactMatch(tb->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1144 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1145 { int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1146 if (f->tintro && f->tintro->next->isBaseOf(f->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1147 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1148 e = new DelegateExp(loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1149 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1150 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1151 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1152 if (func->tintro)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1153 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1154 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1155 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1156 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1157 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1158 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1159 { int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1161 if (func->tintro && func->tintro->next->isBaseOf(func->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1162 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1163 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1164 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1165 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1166 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1168 Expression *CondExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1169 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1170 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1171
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1172 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1173 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1174 if (1 || e1->op == TOKstring || e2->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1175 { 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
1176 e->type = t;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1179 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1180 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1181 return e;
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
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1186 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1187 * Scale addition/subtraction to/from pointer.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1188 */
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 Expression *BinExp::scaleFactor(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1191 { d_uns64 stride;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1192 Type *t1b = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1193 Type *t2b = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1195 if (t1b->ty == Tpointer && t2b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1196 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1197 // Replace (ptr + int) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1198 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1199
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1200 stride = t1b->nextOf()->size(loc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1201 if (!t->equals(t2b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1202 e2 = e2->castTo(sc, t);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
1203 // LDC: llvm uses typesafe pointer arithmetic
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1204 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1205 if (t1b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1206 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1207 // This perhaps should be done by rewriting as &p[i]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1208 // and letting back end do it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1209 e2 = new UshrExp(loc, e2, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1210 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1211 e2 = new MulExp(loc, e2, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1212 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1213 e2->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1214 type = e1->type;
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 else if (t2b->ty == Tpointer && t1b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1217 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1218 // Replace (int + ptr) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1219 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1220 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1221
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1222 stride = t2b->nextOf()->size(loc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1223 if (!t->equals(t1b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1224 e = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1225 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1226 e = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1227 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1228 if (t2b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1229 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1230 e = new UshrExp(loc, e, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1231 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1232 e = new MulExp(loc, e, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1233 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1234 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1235 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1236 e1 = e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1237 e2 = e;
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 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1240 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1241
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1242 /************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1243 * Bring leaves to common type.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1244 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1245
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1246 Expression *BinExp::typeCombine(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1247 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1248 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1249 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1250 Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1251 TY ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1253 //printf("BinExp::typeCombine()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1254 //dump(0);
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 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1257 e2 = e2->integralPromotions(sc);
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 // BUG: do toBasetype()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1260 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1261 t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1262 assert(t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1263
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1264 //if (t1) printf("\tt1 = %s\n", t1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1265 //if (t2) printf("\tt2 = %s\n", t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1266 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1267 if (!t2) printf("\te2 = '%s'\n", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1268 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1269 assert(t2);
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 Type *t1b = t1->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1272 Type *t2b = t2->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1273
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1274 ty = (TY)Type::impcnvResult[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1275 if (ty != Terror)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1276 { TY ty1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1277 TY ty2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1278
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1279 ty1 = (TY)Type::impcnvType1[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1280 ty2 = (TY)Type::impcnvType2[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1282 if (t1b->ty == ty1) // if no promotions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1283 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1284 if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1285 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1286 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1287 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1288 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1289 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1290
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1291 if (t1b == t2b)
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 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1294 type = t1b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1295 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1296 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1297 }
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 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1300 type = Type::basic[ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1301
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1302 t1 = Type::basic[ty1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1303 t2 = Type::basic[ty2];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1304 e1 = e1->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1305 e2 = e2->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1306 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1307 if (type != Type::basic[ty])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1308 { t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1309 type = Type::basic[ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1310 return castTo(sc, t);
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 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1313 //printf("after typeCombine():\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1314 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1315 //printf("ty = %d, ty1 = %d, ty2 = %d\n", ty, ty1, ty2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1316 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1317 }
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 = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1320 if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1321 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1322 if ((t1->ty == Tstruct || t1->ty == Tclass) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1323 (op == TOKmin || op == TOKadd))
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 if (t1->isintegral() && t2->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1327 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1328 printf("t1 = %s, t2 = %s\n", t1->toChars(), t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1329 int sz1 = t1->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1330 int sz2 = t2->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1331 int sign1 = t1->isunsigned() == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1332 int sign2 = t2->isunsigned() == 0;
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 if (sign1 == sign2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1335 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1336 if (sz1 < sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1337 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1338 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1339 goto Lt1;
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 if (!sign1)
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 if (sz1 >= sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1344 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1345 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1346 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1347 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1348 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1350 if (sz2 >= sz1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1351 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1352 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1353 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1356 else if (t1->ty == Tpointer && t2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1357 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1358 // Bring pointers to compatible type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1359 Type *t1n = t1->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1360 Type *t2n = t2->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1362 //t1->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1363 //t2->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1364 //if (t1n == t2n) *(char *)0 = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1365 assert(t1n != t2n);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1366 if (t1n->ty == Tvoid) // pointers to void are always compatible
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1367 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1368 else if (t2n->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1369 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1370 else if (t1n->ty == Tclass && t2n->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1371 { ClassDeclaration *cd1 = t1n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1372 ClassDeclaration *cd2 = t2n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1373 int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1374
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1375 if (cd1->isBaseOf(cd2, &offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1376 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1377 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1378 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1379 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1380 else if (cd2->isBaseOf(cd1, &offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1382 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1383 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1384 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1385 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1386 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1387 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1388 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1389 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1390 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1391 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1392 else if ((t1->ty == Tsarray || t1->ty == Tarray) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1393 e2->op == TOKnull && t2->ty == Tpointer && t2->nextOf()->ty == Tvoid)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1394 { /* (T[n] op void*)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1395 * (T[] op void*)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1396 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1397 goto Lx1;
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 ((t2->ty == Tsarray || t2->ty == Tarray) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1400 e1->op == TOKnull && t1->ty == Tpointer && t1->nextOf()->ty == Tvoid)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1401 { /* (void* op T[n])
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1402 * (void* op T[])
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1403 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1404 goto Lx2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1405 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1406 else if ((t1->ty == Tsarray || t1->ty == Tarray) && t1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1408 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1410 else if ((t2->ty == Tsarray || t2->ty == Tarray) && t2->implicitConvTo(t1))
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 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1414 else if (t1->ty == Tclass || t2->ty == Tclass)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1415 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1416 while (1)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1417 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1418 int i1 = e2->implicitConvTo(t1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1419 int i2 = e1->implicitConvTo(t2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1420
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1421 if (i1 && i2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1422 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1423 // We have the case of class vs. void*, so pick class
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1424 if (t1->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1425 i1 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1426 else if (t2->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1427 i2 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1428 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1429
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1430 if (i2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1431 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1432 goto Lt2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1434 else if (i1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1435 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1436 goto Lt1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1437 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1438 else if (t1->ty == Tclass && t2->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1439 { TypeClass *tc1 = (TypeClass *)t1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1440 TypeClass *tc2 = (TypeClass *)t2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1441
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1442 /* Pick 'tightest' type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1443 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1444 ClassDeclaration *cd1 = tc1->sym->baseClass;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1445 ClassDeclaration *cd2 = tc2->sym->baseClass;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1446
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1447 if (cd1 && cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1448 { t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1449 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1450 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1451 else if (cd1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1452 t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1453 else if (cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1454 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1455 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1456 goto Lincompatible;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1457 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1458 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1459 goto Lincompatible;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1461 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1462 else if ((e1->op == TOKstring || e1->op == TOKnull) && e1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1463 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1464 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1465 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1466 //else if (e2->op == TOKstring) { printf("test2\n"); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1467 else if ((e2->op == TOKstring || e2->op == TOKnull) && e2->implicitConvTo(t1))
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 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1470 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1471 else if (t1->ty == Tsarray && t2->ty == Tsarray &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1472 e2->implicitConvTo(t1->nextOf()->arrayOf()))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1473 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1474 Lx1:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1475 t = t1->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1476 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1477 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1478 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1479 else if (t1->ty == Tsarray && t2->ty == Tsarray &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1480 e1->implicitConvTo(t2->nextOf()->arrayOf()))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1482 Lx2:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1483 t = t2->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1484 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1485 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1486 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1487 else if (t1->isintegral() && t2->isintegral())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1488 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1489 assert(0);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1490 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1491 else if (e1->op == TOKslice && t1->ty == Tarray &&
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1492 e2->implicitConvTo(t1->nextOf()))
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1493 { // T[] op T
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1494 e2 = e2->castTo(sc, t1->nextOf());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1495 t = t1->nextOf()->arrayOf();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1496 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1497 else if (e2->op == TOKslice && t2->ty == Tarray &&
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1498 e1->implicitConvTo(t2->nextOf()))
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1499 { // T op T[]
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1500 e1 = e1->castTo(sc, t2->nextOf());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1501 t = t2->nextOf()->arrayOf();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1502
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1503 //printf("test %s\n", e->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1504 e1 = e1->optimize(WANTvalue);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1505 if (isCommutative() && e1->isConst())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1506 { /* Swap operands to minimize number of functions generated
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1507 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1508 //printf("swap %s\n", e->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1509 Expression *tmp = e1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1510 e1 = e2;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1511 e2 = tmp;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1512 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1513 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1514 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1515 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1516 Lincompatible:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1517 incompatibleTypes();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1518 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1519 Lret:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1520 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1521 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1522 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1523 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1524
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1525
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1526 Lt1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1527 e2 = e2->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1528 t = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1529 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1530
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1531 Lt2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1532 e1 = e1->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1533 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1534 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1535 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1536
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1537 /***********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1538 * Do integral promotions (convertchk).
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1539 * Don't convert <array of> to <pointer to>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1540 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1542 Expression *Expression::integralPromotions(Scope *sc)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1543 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1544 Expression *e = this;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1545
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1546 //printf("integralPromotions %s %s\n", e->toChars(), e->type->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1547 switch (type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1548 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1549 case Tvoid:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1550 error("void has no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1551 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1552
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1553 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1554 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1555 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1556 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1557 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1558 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1559 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1560 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1561 e = e->castTo(sc, Type::tint32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1562 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1564 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1565 e = e->castTo(sc, Type::tuns32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1566 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1567 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1568 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1569 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1570