annotate dmd/cast.c @ 1638:0de4525a9ed6

Apply workaround for #395 by klickverbot.
author Christian Kamm <kamm incasoftware de>
date Mon, 08 Mar 2010 20:06:08 +0100
parents c61782a76dff
children
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
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1133
diff changeset
2 // Copyright (c) 1999-2009 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
1103
b30fe7e1dbb9 - Updated to DMD frontend 1.041.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 846
diff changeset
13 #include "rmem.h"
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
14
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
15 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
16 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
17 #include "utf.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
18 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
19 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
21 /* ==================== implicitCast ====================== */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
22
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
23 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
24 * Do an implicit cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
25 * Issue error if it can't be done.
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 Expression *Expression::implicitCastTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
29 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
30 //printf("implicitCastTo(%s) => %s\n", type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
31 if (implicitConvTo(t))
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
32 { TY tyfrom = type->toBasetype()->ty;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
33 TY tyto = t->toBasetype()->ty;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
34 if (global.params.warnings &&
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
35 Type::impcnvWarn[tyfrom][tyto] &&
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
36 op != TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
37 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
38 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
39
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
40 if (e->op == TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
41 return e->implicitCastTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
42
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
43 if (tyfrom == Tint32 &&
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
44 (op == TOKadd || op == TOKmin ||
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
45 op == TOKand || op == TOKor || op == TOKxor)
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
46 )
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
47 {
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
48 /* 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
49 * 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
50 * 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
51 * 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
52 * 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
53 */
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
54 ;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
55 }
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
56 else
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
57 {
1133
eeb8b95ea92e Cleanup DMD 1.041 merge.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
58 warning("implicit conversion of expression (%s) of type %s to %s can cause loss of data",
eeb8b95ea92e Cleanup DMD 1.041 merge.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1103
diff changeset
59 toChars(), type->toChars(), t->toChars());
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
60 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
61 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
62 #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
63 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
64 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
65 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
66 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
67 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
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 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
70 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
71 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
72
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
73 Expression *e = optimize(WANTflags | WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
74 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
75 return e->implicitCastTo(sc, t);
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 #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
78 printf("ty = %d\n", type->ty);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
79 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
80 type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
81 printf("to:\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
82 t->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
83 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
84 //printf("%p %p %p\n", type->nextOf()->arrayOf(), type, t);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
85 fflush(stdout);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
86 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
87 if (!t->deco)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
88 { /* Can happen with:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
89 * enum E { One }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
90 * class A
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
91 * { static void fork(EDG dg) { dg(E.One); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
92 * alias void delegate(E) EDG;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
93 * }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
94 * Should eventually make it work.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
95 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
96 error("forward reference to type %s", t->toChars());
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 else if (t->reliesOnTident())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
99 error("forward reference to type %s", t->reliesOnTident()->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
100
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
101 error("cannot implicitly convert expression (%s) of type %s to %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
102 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
103 return castTo(sc, t);
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
106 /*******************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
107 * Return !=0 if we can implicitly convert this to type t.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
108 * Don't do the actual cast.
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 MATCH Expression::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
112 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
113 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
114 printf("Expression::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
115 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
116 #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
117 //static int nest; if (++nest == 10) halt();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
118 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
119 { error("%s is not an expression", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
120 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
121 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
122 if (t->ty == Tbit && isBit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
123 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
124 Expression *e = optimize(WANTvalue | WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
125 if (e != this)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
126 { //printf("optimzed to %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
127 return e->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
128 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
129 MATCH match = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
130 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
131 return match;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
132 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
133 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
134 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
135 { 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
136 TypeFunction *tf = (TypeFunction *)td->nextOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
137
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
138 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
139 !(tf->arguments && tf->arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
140 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
141 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
142 match = type->implicitConvTo(tf->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
143 if (match)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
144 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
145 if (tf->nextOf()->toBasetype()->ty == Tvoid)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
146 return MATCHconvert;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
147 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
148 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
149 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
150 return MATCHnomatch;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
154 MATCH IntegerExp::implicitConvTo(Type *t)
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 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
157 printf("IntegerExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
158 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
159 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
160 if (type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
161 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
163 enum TY ty = type->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
164 enum TY toty = t->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
166 if (type->implicitConvTo(t) == MATCHnomatch && t->ty == Tenum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
167 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
168 return MATCHnomatch;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
171 switch (ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
172 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
173 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
174 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
175 value &= 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
176 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
177 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
179 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
180 value = (signed char)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
181 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
182 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
184 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
185 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
186 value &= 0xFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
187 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
188 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
189
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
190 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
191 value = (short)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
192 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
193 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
195 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
196 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
197 value &= 0xFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
198 ty = Tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
199 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
200
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
201 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
202 value = (int)value;
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 Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
206 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
207 value &= 0xFFFFFFFF;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
208 ty = Tuns32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
209 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
211 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
212 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
213 }
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 // Only allow conversion if no change in value
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
216 switch (toty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
217 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
218 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
219 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
220 if ((value & 1) != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
221 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
222 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
223
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
224 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
225 if ((signed char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
226 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
227 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
228
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
229 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
230 case Tuns8:
1195
e961851fb8be Merged DMD 1.042.
Tomas Lindquist Olsen <tomas.l.olsen gmail.com>
parents: 1133
diff changeset
231 //printf("value = %llu %llu\n", (dinteger_t)(unsigned char)value, value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
232 if ((unsigned char)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
233 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
234 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
235
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
236 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
237 if ((short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
238 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
239 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
240
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
241 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
242 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
243 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
244 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
245
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
246 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
247 if (ty == Tuns32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
249 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
250 else if ((int)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
251 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
252 goto Lyes;
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 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
255 if (ty == Tint32)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
256 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
257 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
258 else if ((unsigned)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
259 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
260 goto Lyes;
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 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
263 if (value > 0x10FFFFUL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
264 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
265 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
266
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
267 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
268 if ((unsigned short)value != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
269 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
270 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
271
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
272 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
273 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
274 volatile float f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
275 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
276 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
277 f = (float)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
278 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
279 goto Lno;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
282 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
283 f = (float)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
284 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
285 goto Lno;
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 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
288 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
289
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
290 case Tfloat64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
291 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
292 volatile double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
293 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
294 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
295 f = (double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
296 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
297 goto Lno;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
300 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
301 f = (double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
302 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
303 goto Lno;
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 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
306 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
307
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
308 case Tfloat80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
309 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
310 volatile long double f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
311 if (type->isunsigned())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
312 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
313 f = (long double)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
314 if (f != value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
315 goto Lno;
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
318 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
319 f = (long double)(long long)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
320 if (f != (long long)value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
321 goto Lno;
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 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
324 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
325 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
326 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
327
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
328 Lyes:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
329 //printf("MATCHconvert\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
330 return MATCHconvert;
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 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
333 //printf("MATCHnomatch\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
334 return MATCHnomatch;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
337 MATCH NullExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
338 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
339 #if 0
717
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
340 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
341 toChars(), type->toChars(), t->toChars(), committed);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
342 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
343 if (this->type->equals(t))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
344 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
345 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
346 if (type->ty == Tpointer && type->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
347 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
348 if (t->ty == Ttypedef)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
349 t = ((TypeTypedef *)t)->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
350 if (t->ty == Tpointer || t->ty == Tarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
351 t->ty == Taarray || t->ty == Tclass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
352 t->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
353 return committed ? MATCHconvert : MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
355 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
356 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
357
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
358 #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
359 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
360 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
361 #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
362 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
363 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
364 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
365 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
366 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
367 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
368 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
369 ((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
370 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
371 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
372 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
373 { 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
374 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
375 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
376 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
377 else
1619
c61782a76dff Merge DMD r304: refactor invariant => immutable
Leandro Lucarella <llucax@gmail.com>
parents: 1587
diff changeset
378 { assert(t->mod == MODimmutable);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
379 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
380 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
381 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
382 //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
383 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
384 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
385 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
386 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
387 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
388 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
389 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
390
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
391 MATCH StringExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
392 { MATCH m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
393
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
394 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
395 printf("StringExp::implicitConvTo(this=%s, committed=%d, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
396 toChars(), committed, type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
397 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
398 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
399 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
400 if (!committed && t->ty == Tpointer && t->next->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
401 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
402 return MATCHnomatch;
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 (type->ty == Tsarray || type->ty == Tarray || type->ty == Tpointer)
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 if (type->next->ty == Tchar)
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 switch (t->ty)
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 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
411 if (type->ty == Tsarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
412 ((TypeSArray *)type)->dim->toInteger() !=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
413 ((TypeSArray *)t)->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
414 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
415 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
416 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
417 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
418 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
419 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
420 if (t->next->ty == Tchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
421 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
422 else if (t->next->ty == Twchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
423 return MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
424 else if (t->next->ty == Tdchar)
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 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
427 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
428 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
429 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
430 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
431 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
432 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
433 m = (MATCH)type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
434 if (m)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
435 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
436 return m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
437 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
438
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
439 return MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
440 #endif
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 MATCH ArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
444 { MATCH result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
445
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
446 #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
447 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
448 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
449 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
450 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
451 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
452 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
453 (typeb->ty == Tarray || typeb->ty == Tsarray))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
454 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
455 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
456 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
457 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
458 result = MATCHnomatch;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
459 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
460
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
461 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
462 { 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
463 MATCH m = (MATCH)e->implicitConvTo(tb->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
464 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
465 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
466 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
467 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
468 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
469 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
470 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
471 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
472 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
473 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
474
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
475 MATCH AssocArrayLiteralExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
476 { MATCH result = MATCHexact;
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 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
479 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
480 if (tb->ty == Taarray && typeb->ty == Taarray)
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 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
483 { Expression *e = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
484 MATCH m = (MATCH)e->implicitConvTo(((TypeAArray *)tb)->key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
485 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
486 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
487 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
488 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
489 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
490 m = (MATCH)e->implicitConvTo(tb->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
491 if (m < result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
492 result = m; // remember worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
493 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
494 break; // no need to check for worse
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
495 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
496 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
497 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
498 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
499 return Expression::implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
500 }
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 MATCH AddrExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
503 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
504 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
505 printf("AddrExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
506 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
507 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
508 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
509
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
510 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
511 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
512
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
513 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
514 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
515 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
516 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
517 FuncDeclaration *f;
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 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
520 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
521 t->ty == Tpointer && t->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
522 e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
523 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
524 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
525 f = ve->var->isFuncDeclaration();
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
526 if (f && f->overloadExactMatch(t->next, m))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
527 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
528 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
529 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
530 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
531 return result;
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 MATCH SymOffExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
535 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
536 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
537 printf("SymOffExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
538 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
539 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
540 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
542 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
543 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
544
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
545 if (result == MATCHnomatch)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
546 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
547 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
548 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
549
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
550 t = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
551 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
552 t->ty == Tpointer && t->next->ty == Tfunction)
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 f = var->isFuncDeclaration();
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
555 if (f && f->overloadExactMatch(t->next, m))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
556 result = MATCHexact;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
559 //printf("\tresult = %d\n", result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
560 return result;
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 MATCH DelegateExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
564 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
565 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
566 printf("DelegateExp::implicitConvTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
567 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
568 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
569 MATCH result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
570
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
571 result = type->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
573 if (result == 0)
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 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
576 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
577
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
578 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
579 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
580 t->ty == Tdelegate && t->nextOf()->ty == Tfunction)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
581 {
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
582 if (func && func->overloadExactMatch(t->nextOf(), m))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
583 result = MATCHexact;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
585 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
586 return result;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
587 }
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 MATCH CondExp::implicitConvTo(Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
590 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
591 MATCH m1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
592 MATCH m2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
593
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
594 m1 = e1->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
595 m2 = e2->implicitConvTo(t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
596
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
597 // Pick the worst match
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
598 return (m1 < m2) ? m1 : m2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
599 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
602 /* ==================== castTo ====================== */
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 * Do an explicit cast.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
606 */
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 Expression *Expression::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
609 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
610 //printf("Expression::castTo(this=%s, t=%s)\n", toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
611 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
612 printf("Expression::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
613 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
614 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
615 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
616 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
617 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
618 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
619 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
620 if (tb != typeb)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
621 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
622 // Do (type *) cast of (type [dim])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
623 if (tb->ty == Tpointer &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
624 typeb->ty == Tsarray
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 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
627 //printf("Converting [dim] to *\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
628
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
629 if (typeb->size(loc) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
630 e = new NullExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
631 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
632 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
633 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
634 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
635 else if (tb->ty == Tdelegate && type->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
636 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
637 TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
638 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
639 return toDelegate(sc, tf->nextOf());
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 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
642 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
643 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
644 e = new CastExp(loc, e, tb);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
645 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
646 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
647 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
648 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
649 e = e->copy(); // because of COW for assignment to e->type
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 assert(e != this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
652 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
653 //printf("Returning: %s\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
654 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
655 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
656
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
657
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
658 Expression *RealExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
659 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
660 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
661 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
662 if ((type->isreal() && t->isreal()) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
663 (type->isimaginary() && t->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
664 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
665 { e = copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
666 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
667 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
668 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
669 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
670 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
671 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
672 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
673
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
674
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
675 Expression *ComplexExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
676 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
677 if (type != t)
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 if (type->iscomplex() && t->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
680 { e = copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
681 e->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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
684 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
685 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
686 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
687 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
688
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 Expression *NullExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
691 { NullExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
692 Type *tb;
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 //printf("NullExp::castTo(t = %p)\n", t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
695 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
696 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
697 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
698 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
699 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
700 e = (NullExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
701 e->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
702 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
703 e->type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
704 if (tb != e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
705 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
706 // NULL implicitly converts to any pointer type or dynamic array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
707 if (e->type->ty == Tpointer && e->type->nextOf()->ty == Tvoid &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
708 (tb->ty == Tpointer || tb->ty == Tarray || tb->ty == Taarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
709 tb->ty == Tdelegate))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
710 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
711 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
712 if (tb->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
713 { TypeDelegate *td = (TypeDelegate *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
714 TypeFunction *tf = (TypeFunction *)td->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
715
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
716 if (!tf->varargs &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
717 !(tf->arguments && tf->arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
718 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
719 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
720 return Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
721 }
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 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
724 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
725 else
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 return e->Expression::castTo(sc, t);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
730 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
731 return e;
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 Expression *StringExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
735 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
736 /* This follows copy-on-write; any changes to 'this'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
737 * will result in a copy.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
738 * The this->string member is considered immutable.
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 StringExp *se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
741 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
742 int copied = 0;
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 //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
745
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
746 if (!committed && t->ty == Tpointer && t->nextOf()->ty == Tvoid)
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 error("cannot convert string literal to void*");
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
751 se = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
752 if (!committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
753 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
754 se->committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
755 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
756 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
758 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
759 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
760 return se;
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
763 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
764 //printf("\ttype = %s\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
765 if (tb->ty == Tdelegate && type->toBasetype()->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
766 return Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
767
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
768 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
769 if (typeb == tb)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
770 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
771 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
772 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
773 copied = 1;
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 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
776 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
777 }
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 if (tb->ty != Tsarray && tb->ty != Tarray && tb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
780 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
781 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
782 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
783 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
784 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
785 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
786 if (typeb->ty != Tsarray && typeb->ty != Tarray && typeb->ty != Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
787 { if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
788 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
789 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
790 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
791 goto Lcast;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
792 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
793
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
794 if (typeb->nextOf()->size() == tb->nextOf()->size())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
795 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
796 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
797 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
798 copied = 1;
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 (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
801 goto L2; // handle possible change in static array dimension
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
802 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
803 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
804 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
805
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
806 if (committed)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
807 goto Lcast;
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 #define X(tf,tt) ((tf) * 256 + (tt))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
810 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
811 OutBuffer buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
812 size_t newlen = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
813 int tfty = typeb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
814 int ttty = tb->nextOf()->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
815 switch (X(tfty, ttty))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
816 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
817 case X(Tchar, Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
818 case X(Twchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
819 case X(Tdchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
820 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
821
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
822 case X(Tchar, Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
823 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
824 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
825 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
826 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
827 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
828 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
829 buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
830 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
831 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
832 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
833 goto L1;
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 case X(Tchar, Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
836 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
837 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
838 char *p = utf_decodeChar((unsigned char *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
839 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
840 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
841 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
842 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
843 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
844 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
845 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
846
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
847 case X(Twchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
848 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
849 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
850 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
851 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
852 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
853 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
854 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
855 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
856 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
857 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
858 goto L1;
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 case X(Twchar,Tdchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
861 for (size_t u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
862 { unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
863 char *p = utf_decodeWchar((unsigned short *)se->string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
864 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
865 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
866 buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
867 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
868 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
869 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
870 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
871
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
872 case X(Tdchar,Tchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
873 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
874 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
875 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
876 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
877 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
878 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
879 buffer.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
880 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
881 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
882 newlen = buffer.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
883 buffer.writeUTF8(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
884 goto L1;
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 case X(Tdchar,Twchar):
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
887 for (size_t u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
888 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
889 unsigned c = ((unsigned *)se->string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
890 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
891 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
892 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
893 buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
894 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
895 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
896 newlen = buffer.offset / 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
897 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
898 goto L1;
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 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
901 if (!copied)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
902 { se = (StringExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
903 copied = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
904 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
905 se->string = buffer.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
906 se->len = newlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
907 se->sz = tb->nextOf()->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
908 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
910 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
911 assert(typeb->nextOf()->size() != tb->nextOf()->size());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
912 goto Lcast;
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
915 #undef X
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
916 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
917 assert(copied);
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 // See if need to truncate or extend the literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
920 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
921 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
922 int dim2 = ((TypeSArray *)tb)->dim->toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
923
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
924 //printf("dim from = %d, to = %d\n", se->len, dim2);
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 // Changing dimensions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
927 if (dim2 != se->len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
929 // Copy when changing the string literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
930 unsigned newsz = se->sz;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
931 void *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
932 int d;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
933
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
934 d = (dim2 < se->len) ? dim2 : se->len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
935 s = (unsigned char *)mem.malloc((dim2 + 1) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
936 memcpy(s, se->string, d * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
937 // Extend with 0, add terminating 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
938 memset((char *)s + d * newsz, 0, (dim2 + 1 - d) * newsz);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
939 se->string = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
940 se->len = dim2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
941 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
942 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
943 se->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
944 return se;
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 Lcast:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
947 Expression *e = new CastExp(loc, se, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
948 e->type = t; // so semantic() won't be run on e
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
949 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
950 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
951
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
952 Expression *AddrExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
953 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
954 Type *tb;
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 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
957 printf("AddrExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
958 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
959 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
960 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
961
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
962 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
963 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
964 if (tb != type)
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 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
967 VarExp *ve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
968 FuncDeclaration *f;
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 if (type->ty == Tpointer && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
971 tb->ty == Tpointer && tb->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
972 e1->op == TOKvar)
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 ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
975 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
976 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
977 {
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
978 f = f->overloadExactMatch(tb->next, m);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
979 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
980 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
981 e = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
982 e->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
983 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
984 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
985 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
986 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
987 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
988 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
989 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
990 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
991 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
992 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
993 }
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
996 Expression *TupleExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
997 { TupleExp *e = (TupleExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
998 e->exps = (Expressions *)exps->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
999 for (size_t i = 0; i < e->exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1000 { Expression *ex = (Expression *)e->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1001 ex = ex->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1002 e->exps->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1003 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1004 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1005 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1006
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 Expression *ArrayLiteralExp::castTo(Scope *sc, Type *t)
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 #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
1011 printf("ArrayLiteralExp::castTo(this=%s, type=%s, => %s)\n",
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1012 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1013 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1014 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1015 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1016 ArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1017 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1018 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1019 if ((tb->ty == Tarray || tb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1020 (typeb->ty == Tarray || typeb->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1021 // Not trying to convert non-void[] to void[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1022 !(tb->nextOf()->toBasetype()->ty == Tvoid && typeb->nextOf()->toBasetype()->ty != Tvoid))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1023 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1024 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1025 { TypeSArray *tsa = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1026 if (elements->dim != tsa->dim->toInteger())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1027 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1028 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1029
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1030 e = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1031 e->elements = (Expressions *)elements->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1032 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1033 { Expression *ex = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1034 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1035 e->elements->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1036 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1037 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1038 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1039 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1040 if (tb->ty == Tpointer && typeb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1041 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1042 e = (ArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1043 e->type = typeb->nextOf()->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1044 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1045 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1046 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1047 }
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 Expression *AssocArrayLiteralExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1050 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1051 if (type == t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1052 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1053 AssocArrayLiteralExp *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1054 Type *typeb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1055 Type *tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1056 if (tb->ty == Taarray && typeb->ty == Taarray &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1057 tb->nextOf()->toBasetype()->ty != Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1058 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1059 e = (AssocArrayLiteralExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1060 e->keys = (Expressions *)keys->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1061 e->values = (Expressions *)values->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1062 assert(keys->dim == values->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1063 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1064 { Expression *ex = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1065 ex = ex->castTo(sc, tb->nextOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1066 e->values->data[i] = (void *)ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1067
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1068 ex = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1069 ex = ex->castTo(sc, ((TypeAArray *)tb)->index);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1070 e->keys->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 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1073 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1074 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1075 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1076 return e->Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1077 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1078
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1079 Expression *SymOffExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1080 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1081 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1082 printf("SymOffExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1083 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1084 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1085 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1086
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1087 Type *tb = t->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1088 Type *typeb = type->toBasetype();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1089 if (tb != typeb)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1090 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1091 // Look for pointers to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1092 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1093
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1094 if (typeb->ty == Tpointer && typeb->next->ty == Tfunction &&
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1095 tb->ty == Tpointer && tb->next->ty == Tfunction)
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 f = var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1098 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1099 {
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
1100 f = f->overloadExactMatch(tb->next, m);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1101 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1102 {
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1103 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1104 if (tb->ty == Tdelegate)
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1105 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1106 if (f->needThis() && hasThis(sc))
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1107 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1108 e = new DelegateExp(loc, new ThisExp(loc), f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1109 e = e->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1110 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1111 else if (f->isNested())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1112 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1113 e = new DelegateExp(loc, new IntegerExp(0), f);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1114 e = e->semantic(sc);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1115 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1116 else if (f->needThis())
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1117 { error("no 'this' to create delegate for %s", f->toChars());
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1118 e = new ErrorExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1119 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1120 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1121 { error("cannot cast from function pointer to delegate");
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1122 e = new ErrorExp();
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1123 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1124 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1125 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1126 #endif
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1127 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1128 e = new SymOffExp(loc, f, 0);
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1129 e->type = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1130 }
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1131 #if DMDV2
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1132 f->tookAddressOf++;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1133 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1134 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1135 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1137 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1138 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1139 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1140 else
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1141 {
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1142 e->type = t;
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1143 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1144 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1145 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1146
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1147 Expression *DelegateExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1148 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1149 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1150 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1151 printf("DelegateExp::castTo(this=%s, type=%s, t=%s)\n",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1152 toChars(), type->toChars(), t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1153 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1154 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1155 static char msg[] = "cannot form delegate due to covariant return type";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1156
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1157 tb = t->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1158 type = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1159 if (tb != type)
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 // Look for delegates to functions where the functions are overloaded.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1162 FuncDeclaration *f;
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 if (type->ty == Tdelegate && type->next->ty == Tfunction &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1165 tb->ty == Tdelegate && tb->next->ty == Tfunction)
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 if (func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1168 {
1358
78038e540342 Fix overload resolution issue in dmd bug 313/314 fix.
Christian Kamm <kamm incasoftware de>
parents: 1195
diff changeset
1169 f = func->overloadExactMatch(tb->next, m);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1170 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1171 { int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1172 if (f->tintro && f->tintro->next->isBaseOf(f->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1173 error("%s", msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1174 e = new DelegateExp(loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1175 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1176 return e;
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 if (func->tintro)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1179 error("%s", msg);
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 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1182 e = Expression::castTo(sc, t);
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 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1185 { int offset;
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 if (func->tintro && func->tintro->next->isBaseOf(func->type->next, &offset) && offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1188 error("%s", msg);
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 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1191 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1192 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1193
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1194 Expression *CondExp::castTo(Scope *sc, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1195 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1196 Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1198 if (type != t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1199 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1200 if (1 || e1->op == TOKstring || e2->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1201 { 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
1202 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1203 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1204 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1205 e = Expression::castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1206 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1207 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1208 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1210 /* ==================== ====================== */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1211
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1212 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1213 * Scale addition/subtraction to/from pointer.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1214 */
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 Expression *BinExp::scaleFactor(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1217 { d_uns64 stride;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1218 Type *t1b = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1219 Type *t2b = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1221 if (t1b->ty == Tpointer && t2b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1222 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1223 // Replace (ptr + int) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1224 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1225
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1226 stride = t1b->nextOf()->size(loc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1227 if (!t->equals(t2b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1228 e2 = e2->castTo(sc, t);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 510
diff changeset
1229 // LDC: llvm uses typesafe pointer arithmetic
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1230 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1231 if (t1b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1232 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1233 // This perhaps should be done by rewriting as &p[i]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1234 // and letting back end do it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1235 e2 = new UshrExp(loc, e2, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1236 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1237 e2 = new MulExp(loc, e2, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1238 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1239 e2->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1240 type = e1->type;
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 else if (t2b->ty == Tpointer && t1b->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1243 { // Need to adjust operator by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1244 // Replace (int + ptr) with (ptr + (int * stride))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1245 Type *t = Type::tptrdiff_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1246 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1247
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1248 stride = t2b->nextOf()->size(loc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1249 if (!t->equals(t1b))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1250 e = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1251 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1252 e = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1253 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1254 if (t2b->next->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1255 // BUG: should add runtime check for misaligned offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1256 e = new UshrExp(loc, e, new IntegerExp(0, 3, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1257 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1258 e = new MulExp(loc, e, new IntegerExp(0, stride, t));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1259 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1260 e->type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1261 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1262 e1 = e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1263 e2 = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1264 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1265 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1266 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1268 /************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1269 * Bring leaves to common type.
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1272 Expression *BinExp::typeCombine(Scope *sc)
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 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1275 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1276 Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1277 TY ty;
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 //printf("BinExp::typeCombine()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1280 //dump(0);
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 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1283 e2 = e2->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1284
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1285 // BUG: do toBasetype()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1286 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1287 t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1288 assert(t1);
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 //if (t1) printf("\tt1 = %s\n", t1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1291 //if (t2) printf("\tt2 = %s\n", t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1292 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1293 if (!t2) printf("\te2 = '%s'\n", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1294 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1295 assert(t2);
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 Type *t1b = t1->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1298 Type *t2b = t2->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1300 ty = (TY)Type::impcnvResult[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1301 if (ty != Terror)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1302 { TY ty1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1303 TY ty2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1305 ty1 = (TY)Type::impcnvType1[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1306 ty2 = (TY)Type::impcnvType2[t1b->ty][t2b->ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1307
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1308 if (t1b->ty == ty1) // if no promotions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1309 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1310 if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1311 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1312 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1313 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1314 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1315 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1317 if (t1b == t2b)
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 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1320 type = t1b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1321 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1322 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1323 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1325 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1326 type = Type::basic[ty];
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 t1 = Type::basic[ty1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1329 t2 = Type::basic[ty2];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1330 e1 = e1->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1331 e2 = e2->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1332 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1333 if (type != Type::basic[ty])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1334 { t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1335 type = Type::basic[ty];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1336 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1338 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1339 //printf("after typeCombine():\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1340 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1341 //printf("ty = %d, ty1 = %d, ty2 = %d\n", ty, ty1, ty2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1342 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1345 t = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1346 if (t1 == t2)
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 if ((t1->ty == Tstruct || t1->ty == Tclass) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1349 (op == TOKmin || op == TOKadd))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1350 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1351 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1352 else if (t1->isintegral() && t2->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1353 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1354 printf("t1 = %s, t2 = %s\n", t1->toChars(), t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1355 int sz1 = t1->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1356 int sz2 = t2->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1357 int sign1 = t1->isunsigned() == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1358 int sign2 = t2->isunsigned() == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1359
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1360 if (sign1 == sign2)
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 if (sz1 < sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1363 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1364 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1365 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1366 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1367 if (!sign1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1368 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1369 if (sz1 >= sz2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1370 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1371 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1372 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1374 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1376 if (sz2 >= sz1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1377 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1378 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1379 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1380 }
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 else if (t1->ty == Tpointer && t2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1383 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1384 // Bring pointers to compatible type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1385 Type *t1n = t1->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1386 Type *t2n = t2->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1387
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1388 //t1->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1389 //t2->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1390 //if (t1n == t2n) *(char *)0 = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1391 assert(t1n != t2n);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1392 if (t1n->ty == Tvoid) // pointers to void are always compatible
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1393 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1394 else if (t2n->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1395 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1396 else if (t1n->ty == Tclass && t2n->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1397 { ClassDeclaration *cd1 = t1n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1398 ClassDeclaration *cd2 = t2n->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1399 int offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1401 if (cd1->isBaseOf(cd2, &offset))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1403 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1404 e2 = e2->castTo(sc, t);
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 (cd2->isBaseOf(cd1, &offset))
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 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1409 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1410 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1411 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1412 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1413 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1414 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1415 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1416 goto Lincompatible;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1417 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1418 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
1419 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
1420 { /* (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
1421 * (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
1422 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1423 goto Lx1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1424 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1425 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
1426 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
1427 { /* (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
1428 * (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
1429 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1430 goto Lx2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1431 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1432 else if ((t1->ty == Tsarray || t1->ty == Tarray) && t1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1433 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1434 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1435 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1436 else if ((t2->ty == Tsarray || t2->ty == Tarray) && t2->implicitConvTo(t1))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1438 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1439 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1440 else if (t1->ty == Tclass || t2->ty == Tclass)
336
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 while (1)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1443 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1444 int i1 = e2->implicitConvTo(t1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1445 int i2 = e1->implicitConvTo(t2);
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 (i1 && i2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1448 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1449 // We have the case of class vs. void*, so pick class
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1450 if (t1->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1451 i1 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1452 else if (t2->ty == Tpointer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1453 i2 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1454 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1455
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1456 if (i2)
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 goto Lt2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1460 else if (i1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1461 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1462 goto Lt1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1463 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1464 else if (t1->ty == Tclass && t2->ty == Tclass)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1465 { TypeClass *tc1 = (TypeClass *)t1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1466 TypeClass *tc2 = (TypeClass *)t2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1467
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1468 /* Pick 'tightest' type
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1469 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1470 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
1471 ClassDeclaration *cd2 = tc2->sym->baseClass;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1472
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1473 if (cd1 && cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1474 { t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1475 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1476 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1477 else if (cd1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1478 t1 = cd1->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1479 else if (cd2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1480 t2 = cd2->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1481 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1482 goto Lincompatible;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1483 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1484 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 215
diff changeset
1485 goto Lincompatible;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1486 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1487 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1488 else if ((e1->op == TOKstring || e1->op == TOKnull) && e1->implicitConvTo(t2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1489 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1490 goto Lt2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1491 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1492 //else if (e2->op == TOKstring) { printf("test2\n"); }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1493 else if ((e2->op == TOKstring || e2->op == TOKnull) && e2->implicitConvTo(t1))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1494 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1495 goto Lt1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1496 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1497 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
1498 e2->implicitConvTo(t1->nextOf()->arrayOf()))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1499 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1500 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
1501 t = t1->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1502 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1503 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1504 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1505 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
1506 e1->implicitConvTo(t2->nextOf()->arrayOf()))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1507 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1508 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
1509 t = t2->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1510 e1 = e1->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1511 e2 = e2->castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1512 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1513 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
1514 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1515 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
1516 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1517 else if (e1->isArrayOperand() && 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
1518 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
1519 { // 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
1520 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
1521 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
1522 }
1587
def7a1d494fd Merge DMD 1.051
Christian Kamm <kamm incasoftware de>
parents: 1367
diff changeset
1523 else if (e2->isArrayOperand() && 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
1524 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
1525 { // 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
1526 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
1527 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
1528
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1529 //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
1530 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
1531 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
1532 { /* 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
1533 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1534 //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
1535 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
1536 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
1537 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
1538 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1539 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1540 else
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 Lincompatible:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1543 incompatibleTypes();
1367
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1358
diff changeset
1544 type = Type::terror;
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1358
diff changeset
1545 e1 = new ErrorExp();
8026319762be Merged DMD 1.045 !!!
Tomas Lindquist Olsen <tomas.l.olsen gmail com>
parents: 1358
diff changeset
1546 e2 = new ErrorExp();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1547 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1548 Lret:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1549 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1550 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1551 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1552 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1553
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1554
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1555 Lt1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1556 e2 = e2->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1557 t = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1558 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1559
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1560 Lt2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1561 e1 = e1->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1562 t = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1563 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1564 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1565
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1566 /***********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1567 * Do integral promotions (convertchk).
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1568 * Don't convert <array of> to <pointer to>
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
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1571 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
1572 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1573 Expression *e = this;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1574
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 336
diff changeset
1575 //printf("integralPromotions %s %s\n", e->toChars(), e->type->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1576 switch (type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1577 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1578 case Tvoid:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1579 error("void has no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1580 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1581
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1582 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1583 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1584 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1585 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1586 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1587 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1588 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1589 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1590 e = e->castTo(sc, Type::tint32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1591 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1593 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1594 e = e->castTo(sc, Type::tuns32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1595 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1596 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1597 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1598 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 131
diff changeset
1599