annotate dmd/expression.c @ 984:4c0df37d0421

Removing ldc.conf. (IMPORTANT: run 'cmake .' after pull) Added it to .hgignore. This gets rid of spurious differences caused by CMake regenerating it differently. Just run 'cmake .' to get it back in your local checkout.
author Frits van Bommel <fvbommel wxs.nl>
date Thu, 19 Feb 2009 13:50:05 +0100
parents ea82e2077f9d
children 39cf8fa483fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2 // Compiler implementation of the D programming language
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3 // Copyright (c) 1999-2008 by Digital Mars
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
10
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
11 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
12 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
13 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
14 #include <assert.h>
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
15 #if _MSC_VER
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
16 #include <complex>
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
17 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
18 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
19 #include <math.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
20
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
21 #if _WIN32 && __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
22 extern "C" char * __cdecl __locale_decpoint;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
23 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
24
285
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
25 #if __MINGW32__
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
26 #ifndef isnan
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
27 #define isnan _isnan
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
28 #endif
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
29 #endif
297690b5d4a5 [svn r306] Fixed: it's now possible to compile and link llvmdc with MinGW32 and msys on Win32 :D I tried it myself ;) Building the runtime still needs some work, but it's a step in the right direction.
lindquist
parents: 163
diff changeset
30
536
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
31 #ifdef __APPLE__
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
32 #ifndef isnan
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
33 int isnan(double);
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
34 #endif
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
35 #endif
0d2db7efa105 Add isnan for __APPLE__ and darwin version ident for OSX.
Christian Kamm <kamm incasoftware de>
parents: 535
diff changeset
36
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
37 #if IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
38 // Issues with using -include total.h (defines integer_t) and then complex.h fails...
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
39 #undef integer_t
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
40 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
41
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
42 #ifdef __APPLE__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
43 #define integer_t dmd_integer_t
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
44 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
45
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
46 #if IN_GCC || IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
47 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
48 #elif _WIN32
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
49 #include "..\root\mem.h"
571
cbd6c8073a32 Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 536
diff changeset
50 #elif POSIX
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
51 #include "../root/mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
52 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
53
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
54 //#include "port.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
55 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
56 #include "init.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
57 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
58 #include "template.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
59 #include "utf.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
60 #include "enum.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
61 #include "scope.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
62 #include "statement.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
63 #include "declaration.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
64 #include "aggregate.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
65 #include "import.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
66 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
67 #include "dsymbol.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
68 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
69 #include "attrib.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
70 #include "hdrgen.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
71 #include "parse.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
72
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
73 Expression *createTypeInfoArray(Scope *sc, Expression *args[], int dim);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
74 Expression *expandVar(int result, VarDeclaration *v);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
75
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
76 #define LOGSEMANTIC 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
77
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
78 /**********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
79 * Set operator precedence for each operator.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
80 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
81
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
82 // Operator precedence - greater values are higher precedence
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
84 enum PREC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
85 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
86 PREC_zero,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
87 PREC_expr,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
88 PREC_assign,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
89 PREC_cond,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
90 PREC_oror,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
91 PREC_andand,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
92 PREC_or,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
93 PREC_xor,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
94 PREC_and,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
95 PREC_equal,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
96 PREC_rel,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
97 PREC_shift,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
98 PREC_add,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
99 PREC_mul,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
100 PREC_unary,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
101 PREC_primary,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
102 };
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
104 enum PREC precedence[TOKMAX];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
105
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
106 void initPrecedence()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
107 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
108 precedence[TOKdotvar] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
109 precedence[TOKimport] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
110 precedence[TOKidentifier] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
111 precedence[TOKthis] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
112 precedence[TOKsuper] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
113 precedence[TOKint64] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
114 precedence[TOKfloat64] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
115 precedence[TOKnull] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
116 precedence[TOKstring] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
117 precedence[TOKarrayliteral] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
118 precedence[TOKtypedot] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
119 precedence[TOKtypeid] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
120 precedence[TOKis] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
121 precedence[TOKassert] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
122 precedence[TOKfunction] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
123 precedence[TOKvar] = PREC_primary;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
124 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
125 precedence[TOKdefault] = PREC_primary;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
126 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
128 // post
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
129 precedence[TOKdotti] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
130 precedence[TOKdot] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
131 // precedence[TOKarrow] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
132 precedence[TOKplusplus] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
133 precedence[TOKminusminus] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
134 precedence[TOKcall] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
135 precedence[TOKslice] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
136 precedence[TOKarray] = PREC_primary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
137
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
138 precedence[TOKaddress] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
139 precedence[TOKstar] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
140 precedence[TOKneg] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
141 precedence[TOKuadd] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
142 precedence[TOKnot] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
143 precedence[TOKtobool] = PREC_add;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
144 precedence[TOKtilde] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
145 precedence[TOKdelete] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
146 precedence[TOKnew] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
147 precedence[TOKcast] = PREC_unary;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
148
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
149 precedence[TOKmul] = PREC_mul;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
150 precedence[TOKdiv] = PREC_mul;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
151 precedence[TOKmod] = PREC_mul;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
153 precedence[TOKadd] = PREC_add;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
154 precedence[TOKmin] = PREC_add;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
155 precedence[TOKcat] = PREC_add;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
156
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
157 precedence[TOKshl] = PREC_shift;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
158 precedence[TOKshr] = PREC_shift;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
159 precedence[TOKushr] = PREC_shift;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
161 precedence[TOKlt] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
162 precedence[TOKle] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
163 precedence[TOKgt] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
164 precedence[TOKge] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
165 precedence[TOKunord] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
166 precedence[TOKlg] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
167 precedence[TOKleg] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
168 precedence[TOKule] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
169 precedence[TOKul] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
170 precedence[TOKuge] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
171 precedence[TOKug] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
172 precedence[TOKue] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
173 precedence[TOKin] = PREC_rel;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
174
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
175 #if 0
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
176 precedence[TOKequal] = PREC_equal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
177 precedence[TOKnotequal] = PREC_equal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
178 precedence[TOKidentity] = PREC_equal;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
179 precedence[TOKnotidentity] = PREC_equal;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
180 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
181 /* Note that we changed precedence, so that < and != have the same
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
182 * precedence. This change is in the parser, too.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
183 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
184 precedence[TOKequal] = PREC_rel;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
185 precedence[TOKnotequal] = PREC_rel;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
186 precedence[TOKidentity] = PREC_rel;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
187 precedence[TOKnotidentity] = PREC_rel;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
188 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
189
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
190 precedence[TOKand] = PREC_and;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
191
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
192 precedence[TOKxor] = PREC_xor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
193
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
194 precedence[TOKor] = PREC_or;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
196 precedence[TOKandand] = PREC_andand;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
198 precedence[TOKoror] = PREC_oror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
199
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
200 precedence[TOKquestion] = PREC_cond;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
201
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
202 precedence[TOKassign] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
203 precedence[TOKconstruct] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
204 precedence[TOKblit] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
205 precedence[TOKaddass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
206 precedence[TOKminass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
207 precedence[TOKcatass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
208 precedence[TOKmulass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
209 precedence[TOKdivass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
210 precedence[TOKmodass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
211 precedence[TOKshlass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
212 precedence[TOKshrass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
213 precedence[TOKushrass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
214 precedence[TOKandass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
215 precedence[TOKorass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
216 precedence[TOKxorass] = PREC_assign;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
218 precedence[TOKcomma] = PREC_expr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
219 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
220
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
221 /*************************************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
222 * Given var, we need to get the
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
223 * right 'this' pointer if var is in an outer class, but our
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
224 * existing 'this' pointer is in an inner class.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
225 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
226 * e1 existing 'this'
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
227 * ad struct or class we need the correct 'this' for
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
228 * var the specific member of ad we're accessing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
229 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
230
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
231 Expression *getRightThis(Loc loc, Scope *sc, AggregateDeclaration *ad,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
232 Expression *e1, Declaration *var)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
233 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
234 //printf("\ngetRightThis(e1 = %s, ad = %s, var = %s)\n", e1->toChars(), ad->toChars(), var->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
235 L1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
236 Type *t = e1->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
237 //printf("e1->type = %s, var->type = %s\n", e1->type->toChars(), var->type->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
239 /* If e1 is not the 'this' pointer for ad
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
240 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
241 if (ad &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
242 !(t->ty == Tpointer && t->nextOf()->ty == Tstruct &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
243 ((TypeStruct *)t->nextOf())->sym == ad)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
244 &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
245 !(t->ty == Tstruct &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
246 ((TypeStruct *)t)->sym == ad)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
247 )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
248 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
249 ClassDeclaration *cd = ad->isClassDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
250 ClassDeclaration *tcd = t->isClassHandle();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
251
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
252 /* e1 is the right this if ad is a base class of e1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
253 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
254 if (!cd || !tcd ||
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
255 !(tcd == cd || cd->isBaseOf(tcd, NULL))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
256 )
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
257 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
258 /* Only classes can be inner classes with an 'outer'
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
259 * member pointing to the enclosing class instance
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
260 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
261 if (tcd && tcd->isNested())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
262 { /* e1 is the 'this' pointer for an inner class: tcd.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
263 * Rewrite it as the 'this' pointer for the outer class.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
264 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
265
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
266 e1 = new DotVarExp(loc, e1, tcd->vthis);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
267 e1->type = tcd->vthis->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
268 // Do not call checkNestedRef()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
269 //e1 = e1->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
270
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
271 // Skip up over nested functions, and get the enclosing
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
272 // class type.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
273 int n = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
274 Dsymbol *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
275 for (s = tcd->toParent();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
276 s && s->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
277 s = s->toParent())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
278 { FuncDeclaration *f = s->isFuncDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
279 if (f->vthis)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
280 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
281 //printf("rewriting e1 to %s's this\n", f->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
282 n++;
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
283
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
284 // LDC seems dmd misses it sometimes here :/
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
285 f->vthis->nestedref = 1;
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
286
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
287 e1 = new VarExp(loc, f->vthis);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
288 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
289 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
290 if (s && s->isClassDeclaration())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
291 { e1->type = s->isClassDeclaration()->type;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
292 if (n > 1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
293 e1 = e1->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
294 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
295 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
296 e1 = e1->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
297 goto L1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
298 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
299 /* Can't find a path from e1 to ad
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
300 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
301 e1->error("this for %s needs to be type %s not type %s",
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
302 var->toChars(), ad->toChars(), t->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
303 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
304 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
305 return e1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
306 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
307
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
308 /*****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
309 * Determine if 'this' is available.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
310 * If it is, return the FuncDeclaration that has it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
311 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
313 FuncDeclaration *hasThis(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
314 { FuncDeclaration *fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
315 FuncDeclaration *fdthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
317 //printf("hasThis()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
318 fdthis = sc->parent->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
319 //printf("fdthis = %p, '%s'\n", fdthis, fdthis ? fdthis->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
320
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
321 // Go upwards until we find the enclosing member function
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
322 fd = fdthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
323 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
324 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
325 if (!fd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
326 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
327 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
329 if (!fd->isNested())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
330 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
331
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
332 Dsymbol *parent = fd->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
333 while (parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
335 TemplateInstance *ti = parent->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
336 if (ti)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
337 parent = ti->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
338 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
339 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
340 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
341
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
342 fd = fd->parent->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
345 if (!fd->isThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
346 { //printf("test '%s'\n", fd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
347 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
348 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
350 assert(fd->vthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
351 return fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
352
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
353 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
354 return NULL; // don't have 'this' available
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
357
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
358 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
359 * Pull out any properties.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
360 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
361
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
362 Expression *resolveProperties(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
363 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
364 //printf("resolveProperties(%s)\n", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
365 if (e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
366 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
367 Type *t = e->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
368
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
369 if (t->ty == Tfunction /*|| e->op == TOKoverloadset*/)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
370 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
371 e = new CallExp(e->loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
372 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
374
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
375 /* Look for e being a lazy parameter; rewrite as delegate call
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
376 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
377 else if (e->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
378 { VarExp *ve = (VarExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
379
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
380 if (ve->var->storage_class & STClazy)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
382 e = new CallExp(e->loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
383 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
384 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
385 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
386
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
387 else if (e->op == TOKdotexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
388 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
389 e->error("expression has no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
390 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
391
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
392 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
393 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
396 /******************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
397 * Perform semantic() on an array of Expressions.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
398 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
399
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
400 void arrayExpressionSemantic(Expressions *exps, Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
401 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
402 if (exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
403 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
404 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
405 { Expression *e = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
406
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
407 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
408 exps->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
410 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
411 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
412
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
413
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
414 /******************************
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
415 * Perform canThrow() on an array of Expressions.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
416 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
417
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
418 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
419 int arrayExpressionCanThrow(Expressions *exps)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
420 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
421 if (exps)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
422 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
423 for (size_t i = 0; i < exps->dim; i++)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
424 { Expression *e = (Expression *)exps->data[i];
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
425 if (e && e->canThrow())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
426 return 1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
427 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
428 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
429 return 0;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
430 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
431 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
432
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
433 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
434 * Expand tuples.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
435 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
436
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
437 void expandTuples(Expressions *exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
438 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
439 //printf("expandTuples()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
440 if (exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
441 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
442 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
443 { Expression *arg = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
444 if (!arg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
445 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
447 // Look for tuple with 0 members
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
448 if (arg->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
449 { TypeExp *e = (TypeExp *)arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
450 if (e->type->toBasetype()->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
451 { TypeTuple *tt = (TypeTuple *)e->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
452
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
453 if (!tt->arguments || tt->arguments->dim == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
454 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
455 exps->remove(i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
456 if (i == exps->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
457 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
458 i--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
459 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
461 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
462 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
463
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
464 // Inline expand all the tuples
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
465 while (arg->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
466 { TupleExp *te = (TupleExp *)arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
467
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
468 exps->remove(i); // remove arg
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
469 exps->insert(i, te->exps); // replace with tuple contents
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
470 if (i == exps->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
471 return; // empty tuple, no more arguments
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
472 arg = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
473 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
474 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
475 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
476 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
477
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
478 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
479 * Preprocess arguments to function.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
480 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
481
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
482 void preFunctionArguments(Loc loc, Scope *sc, Expressions *exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
483 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
484 if (exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
485 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
486 expandTuples(exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
487
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
488 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
489 { Expression *arg = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
490
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
491 if (!arg->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
492 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
493 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
494 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
495 printf("1: \n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
496 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
497 arg->error("%s is not an expression", arg->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
498 arg = new IntegerExp(arg->loc, 0, Type::tint32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
499 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
500
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
501 arg = resolveProperties(sc, arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
502 exps->data[i] = (void *) arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
503
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
504 //arg->rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
505 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
506 if (arg->type->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
507 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
508 arg = new AddrExp(arg->loc, arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
509 arg = arg->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
510 exps->data[i] = (void *) arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
511 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
512 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
513 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
514 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
515 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
516
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
517 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
518 * Call copy constructor for struct value argument.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
519 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
520 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
521 Expression *callCpCtor(Loc loc, Scope *sc, Expression *e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
522 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
523 Type *tb = e->type->toBasetype();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
524 assert(tb->ty == Tstruct);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
525 StructDeclaration *sd = ((TypeStruct *)tb)->sym;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
526 if (sd->cpctor)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
527 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
528 /* Create a variable tmp, and replace the argument e with:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
529 * (tmp = e),tmp
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
530 * and let AssignExp() handle the construction.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
531 * This is not the most efficent, ideally tmp would be constructed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
532 * directly onto the stack.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
533 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
534 Identifier *idtmp = Lexer::uniqueId("__tmp");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
535 VarDeclaration *tmp = new VarDeclaration(loc, tb, idtmp, new ExpInitializer(0, e));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
536 Expression *ae = new DeclarationExp(loc, tmp);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
537 e = new CommaExp(loc, ae, new VarExp(loc, tmp));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
538 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
539 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
540 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
541 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
542 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
544 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
545 * Now that we know the exact type of the function we're calling,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
546 * the arguments[] need to be adjusted:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
547 * 1. implicitly convert argument to the corresponding parameter type
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
548 * 2. add default arguments for any missing arguments
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
549 * 3. do default promotions on arguments corresponding to ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
550 * 4. add hidden _arguments[] argument
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
551 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
552
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
553 void functionArguments(Loc loc, Scope *sc, TypeFunction *tf, Expressions *arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
554 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
555 unsigned n;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
556
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
557 //printf("functionArguments()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
558 assert(arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
559 size_t nargs = arguments ? arguments->dim : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
560 size_t nparams = Argument::dim(tf->parameters);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
561
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
562 if (nargs > nparams && tf->varargs == 0)
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
563 error(loc, "expected %"PRIuSIZE" arguments, not %"PRIuSIZE, nparams, nargs);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
564
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
565 n = (nargs > nparams) ? nargs : nparams; // n = max(nargs, nparams)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
566
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
567 int done = 0;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
568 for (size_t i = 0; i < n; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
569 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
570 Expression *arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
571
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
572 if (i < nargs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
573 arg = (Expression *)arguments->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
574 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
575 arg = NULL;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
576 Type *tb;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
577
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
578 if (i < nparams)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
579 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
580 Argument *p = Argument::getNth(tf->parameters, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
581
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
582 if (!arg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
583 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
584 if (!p->defaultArg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
585 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
586 if (tf->varargs == 2 && i + 1 == nparams)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
587 goto L2;
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
588 error(loc, "expected %"PRIuSIZE" arguments, not %"PRIuSIZE, nparams, nargs);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
589 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
590 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
591 arg = p->defaultArg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
592 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
593 if (arg->op == TOKdefault)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
594 { DefaultInitExp *de = (DefaultInitExp *)arg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
595 arg = de->resolve(loc, sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
596 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
597 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
598 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
599 arg = arg->copy();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
600 arguments->push(arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
601 nargs++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
602 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
603
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
604 if (tf->varargs == 2 && i + 1 == nparams)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
605 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
606 //printf("\t\tvarargs == 2, p->type = '%s'\n", p->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
607 if (arg->implicitConvTo(p->type))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
608 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
609 if (nargs != nparams)
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
610 error(loc, "expected %"PRIuSIZE" arguments, not %"PRIuSIZE, nparams, nargs);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
611 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
612 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
613 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
614 Type *tb = p->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
615 Type *tret = p->isLazyArray();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
616 switch (tb->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
617 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
618 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
619 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
620 { // Create a static array variable v of type arg->type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
621 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
622 /* GCC 4.0 does not like zero length arrays used like
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
623 this; pass a null array value instead. Could also
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
624 just make a one-element array. */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
625 if (nargs - i == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
626 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
627 arg = new NullExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
628 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
629 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
630 #endif
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
631 Identifier *id = Lexer::uniqueId("__arrayArg");
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
632 Type *t = new TypeSArray(((TypeArray *)tb)->next, new IntegerExp(nargs - i));
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
633 t = t->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
634 VarDeclaration *v = new VarDeclaration(loc, t, id, new VoidInitializer(loc));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
635 v->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
636 v->parent = sc->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
637 //sc->insert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
638
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
639 Expression *c = new DeclarationExp(0, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
640 c->type = v->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
641
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
642 for (size_t u = i; u < nargs; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
643 { Expression *a = (Expression *)arguments->data[u];
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
644 if (tret && !((TypeArray *)tb)->next->equals(a->type))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
645 a = a->toDelegate(sc, tret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
646
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
647 Expression *e = new VarExp(loc, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
648 e = new IndexExp(loc, e, new IntegerExp(u + 1 - nparams));
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
649 AssignExp *ae = new AssignExp(loc, e, a);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
650 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
651 ae->op = TOKconstruct;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
652 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
653 if (c)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
654 c = new CommaExp(loc, c, ae);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
655 else
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
656 c = ae;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
657 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
658 arg = new VarExp(loc, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
659 if (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
660 arg = new CommaExp(loc, c, arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
661 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
662 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
663 case Tclass:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
664 { /* Set arg to be:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
665 * new Tclass(arg0, arg1, ..., argn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
666 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
667 Expressions *args = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
668 args->setDim(nargs - i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
669 for (size_t u = i; u < nargs; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
670 args->data[u - i] = arguments->data[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
671 arg = new NewExp(loc, NULL, NULL, p->type, args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
672 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
673 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
674 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
675 if (!arg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
676 { error(loc, "not enough arguments");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
677 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
678 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
679 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
680 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
681 arg = arg->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
682 //printf("\targ = '%s'\n", arg->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
683 arguments->setDim(i + 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
684 done = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
685 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
686
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
687 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
688 if (!(p->storageClass & STClazy && p->type->ty == Tvoid))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
689 arg = arg->implicitCastTo(sc, p->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
690 if (p->storageClass & (STCout | STCref))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
691 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
692 // BUG: should check that argument to ref is type 'invariant'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
693 // BUG: assignments to ref should also be type 'invariant'
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
694 arg = arg->modifiableLvalue(sc, arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
695
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
696 //if (arg->op == TOKslice)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
697 //arg->error("cannot modify slice %s", arg->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
698 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
699
723
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
700 // LDC we don't want this!
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
701 #if !IN_LLVM
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
702 // Convert static arrays to pointers
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
703 tb = arg->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
704 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
705 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
706 arg = arg->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
707 }
723
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
708 #endif
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
709
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
710 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
711 if (tb->ty == Tstruct && !(p->storageClass & (STCref | STCout)))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
712 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
713 arg = callCpCtor(loc, sc, arg);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
714 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
715 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
716
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
717
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
718 // Convert lazy argument to a delegate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
719 if (p->storageClass & STClazy)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
720 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
721 arg = arg->toDelegate(sc, p->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
722 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
723 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
724 /* Look for arguments that cannot 'escape' from the called
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
725 * function.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
726 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
727 if (!tf->parameterEscapes(p))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
728 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
729 /* Function literals can only appear once, so if this
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
730 * appearance was scoped, there cannot be any others.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
731 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
732 if (arg->op == TOKfunction)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
733 { FuncExp *fe = (FuncExp *)arg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
734 fe->fd->tookAddressOf = 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
735 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
736
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
737 /* For passing a delegate to a scoped parameter,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
738 * this doesn't count as taking the address of it.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
739 * We only worry about 'escaping' references to the function.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
740 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
741 else if (arg->op == TOKdelegate)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
742 { DelegateExp *de = (DelegateExp *)arg;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
743 if (de->e1->op == TOKvar)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
744 { VarExp *ve = (VarExp *)de->e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
745 FuncDeclaration *f = ve->var->isFuncDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
746 if (f)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
747 { f->tookAddressOf--;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
748 //printf("tookAddressOf = %d\n", f->tookAddressOf);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
749 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
750 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
751 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
752 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
753 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
754 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
755 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
756 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
758 // If not D linkage, do promotions
723
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
759 // LDC: don't do promotions on intrinsics
55f6c2e454d7 Implemented correct parameter order according to x86-32 ABI documentation.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 717
diff changeset
760 if (tf->linkage != LINKd && tf->linkage != LINKintrinsic)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
761 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
762 // Promote bytes, words, etc., to ints
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
763 arg = arg->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
764
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
765 // Promote floats to doubles
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
766 switch (arg->type->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
767 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
768 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
769 arg = arg->castTo(sc, Type::tfloat64);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
770 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
771
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
772 case Timaginary32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
773 arg = arg->castTo(sc, Type::timaginary64);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
774 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
775 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
776 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
777
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
778 // Convert static arrays to dynamic arrays
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
779 tb = arg->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
780 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
781 { TypeSArray *ts = (TypeSArray *)tb;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
782 Type *ta = ts->next->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
783 if (ts->size(arg->loc) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
784 { arg = new NullExp(arg->loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
785 arg->type = ta;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
786 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
787 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
788 arg = arg->castTo(sc, ta);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
789 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
790 #if DMDV2
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
791 if (tb->ty == Tstruct)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
792 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
793 arg = callCpCtor(loc, sc, arg);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
794 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
795
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
796 // Give error for overloaded function addresses
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
797 if (arg->op == TOKsymoff)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
798 { SymOffExp *se = (SymOffExp *)arg;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
799 if (se->hasOverloads && !se->var->isFuncDeclaration()->isUnique())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
800 arg->error("function %s is overloaded", arg->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
801 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
802 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
803 arg->rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
804 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
805 arg = arg->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
806 arguments->data[i] = (void *) arg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
807 if (done)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
808 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
810
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
811 #if !IN_LLVM
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
812 // If D linkage and variadic, add _arguments[] as first argument
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
813 if (tf->linkage == LINKd && tf->varargs == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
814 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
815 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
816
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
817 e = createTypeInfoArray(sc, (Expression **)&arguments->data[nparams],
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
818 arguments->dim - nparams);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
819 arguments->insert(0, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
820 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
821 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
822 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
823
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
824 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
825 * Write expression out to buf, but wrap it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
826 * in ( ) if its precedence is less than pr.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
827 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
828
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
829 void expToCBuffer(OutBuffer *buf, HdrGenState *hgs, Expression *e, enum PREC pr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
830 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
831 //if (precedence[e->op] == 0) e->dump(0);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
832 if (precedence[e->op] < pr ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
833 /* Despite precedence, we don't allow a<b<c expressions.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
834 * They must be parenthesized.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
835 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
836 (pr == PREC_rel && precedence[e->op] == pr))
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
837 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
838 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
839 e->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
840 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
841 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
842 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
843 e->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
844 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
845
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
846 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
847 * Write out argument list to buf.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
848 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
849
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
850 void argsToCBuffer(OutBuffer *buf, Expressions *arguments, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
851 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
852 if (arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
853 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
854 for (size_t i = 0; i < arguments->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
855 { Expression *arg = (Expression *)arguments->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
856
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
857 if (arg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
858 { if (i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
859 buf->writeByte(',');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
860 expToCBuffer(buf, hgs, arg, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
861 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
862 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
863 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
864 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
865
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
866 /**************************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
867 * Write out argument types to buf.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
868 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
869
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
870 void argExpTypesToCBuffer(OutBuffer *buf, Expressions *arguments, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
871 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
872 if (arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
873 { OutBuffer argbuf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
874
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
875 for (size_t i = 0; i < arguments->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
876 { Expression *arg = (Expression *)arguments->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
877
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
878 if (i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
879 buf->writeByte(',');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
880 argbuf.reset();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
881 arg->type->toCBuffer2(&argbuf, hgs, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
882 buf->write(&argbuf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
883 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
884 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
885 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
886
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
887 /******************************** Expression **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
888
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
889 Expression::Expression(Loc loc, enum TOK op, int size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
890 : loc(loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
891 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
892 //printf("Expression::Expression(op = %d) this = %p\n", op, this);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
893 this->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
894 this->op = op;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
895 this->size = size;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
896 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
897 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
898
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
899 Expression *Expression::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
900 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
901 //printf("Expression::syntaxCopy()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
902 //dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
903 return copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
904 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
905
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
906 /*********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
907 * Does *not* do a deep copy.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
908 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
910 Expression *Expression::copy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
911 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
912 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
913 if (!size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
914 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
915 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
916 fprintf(stdmsg, "No expression copy for: %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
917 printf("op = %d\n", op);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
918 dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
919 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
920 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
921 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
922 e = (Expression *)mem.malloc(size);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
923 //printf("Expression::copy(op = %d) e = %p\n", op, e);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
924 return (Expression *)memcpy(e, this, size);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
925 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
926
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
927 /**************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
928 * Semantically analyze Expression.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
929 * Determine types, fold constants, etc.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
930 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
931
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
932 Expression *Expression::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
933 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
934 #if LOGSEMANTIC
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
935 printf("Expression::semantic() %s\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
936 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
937 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
938 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
939 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
940 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
941 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
942 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
943
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
944 void Expression::print()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
945 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
946 fprintf(stdmsg, "%s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
947 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
948 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
949
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
950 char *Expression::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
951 { OutBuffer *buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
952 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
953
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
954 memset(&hgs, 0, sizeof(hgs));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
955 buf = new OutBuffer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
956 toCBuffer(buf, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
957 return buf->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
958 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
959
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
960 void Expression::error(const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
961 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
962 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
963 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
964 ::verror(loc, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
965 va_end( ap );
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
966 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
967
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
968 void Expression::rvalue()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
969 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
970 if (type && type->toBasetype()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
971 { error("expression %s is void and has no value", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
972 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
973 dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
974 halt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
975 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
976 type = Type::tint32;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
977 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
978 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
979
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
980 Expression *Expression::combine(Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
981 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
982 if (e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
983 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
984 if (e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
985 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
986 e1 = new CommaExp(e1->loc, e1, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
987 e1->type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
988 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
989 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
990 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
991 e1 = e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
992 return e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
993 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
994
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
995 integer_t Expression::toInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
996 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
997 //printf("Expression %s\n", Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
998 error("Integer constant expression expected instead of %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
999 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1000 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1001
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1002 uinteger_t Expression::toUInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1003 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1004 //printf("Expression %s\n", Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1005 return (uinteger_t)toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1006 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1007
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1008 real_t Expression::toReal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1009 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1010 error("Floating point constant expression expected instead of %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1011 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1012 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1013
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1014 real_t Expression::toImaginary()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1015 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1016 error("Floating point constant expression expected instead of %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1017 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1018 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1019
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1020 complex_t Expression::toComplex()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1021 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1022 error("Floating point constant expression expected instead of %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1023 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1024 return complex_t(real_t(0)); // %% nicer
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1025 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1026 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1027 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1028 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1029
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1030 void Expression::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1031 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1032 buf->writestring(Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1033 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1034
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1035 void Expression::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1036 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1037 error("expression %s is not a valid template value argument", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1038 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1039
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1040 /***************************************
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1041 * Return !=0 if expression is an lvalue.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1042 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1043 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1044 int Expression::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1045 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1046 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1047 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1048 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1049
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1050 /*******************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1051 * Give error if we're not an lvalue.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1052 * If we can, convert expression to be an lvalue.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1053 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1054
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1055 Expression *Expression::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1056 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1057 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1058 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1059 else if (!loc.filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1060 loc = e->loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1061 error("%s is not an lvalue", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1062 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1063 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1064
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1065 Expression *Expression::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1066 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1067 //printf("Expression::modifiableLvalue() %s, type = %s\n", toChars(), type->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1068
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1069 // See if this expression is a modifiable lvalue (i.e. not const)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1070 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1071 if (type && (!type->isMutable() || !type->isAssignable()))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1072 error("%s is not mutable", e->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1073 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1074 return toLvalue(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1075 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1076
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1077 /************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1078 * Detect cases where pointers to the stack can 'escape' the
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1079 * lifetime of the stack frame.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1080 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1081
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1082 void Expression::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1083 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1084 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1085
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1086 void Expression::checkScalar()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1087 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1088 if (!type->isscalar())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1089 error("'%s' is not a scalar, it is a %s", toChars(), type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1090 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1091
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1092 void Expression::checkNoBool()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1093 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1094 if (type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1095 error("operation not allowed on bool '%s'", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1096 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1097
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1098 Expression *Expression::checkIntegral()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1099 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1100 if (!type->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1101 { error("'%s' is not of integral type, it is a %s", toChars(), type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1102 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1103 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1104 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1107 Expression *Expression::checkArithmetic()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1108 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1109 if (!type->isintegral() && !type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1110 { error("'%s' is not of arithmetic type, it is a %s", toChars(), type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1111 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1112 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1113 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1114 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1115
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1116 void Expression::checkDeprecated(Scope *sc, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1117 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1118 s->checkDeprecated(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1119 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1120
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1121 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1122 void Expression::checkPurity(Scope *sc, FuncDeclaration *f)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1123 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1124 if (sc->func && sc->func->isPure() && !sc->intypeof && !f->isPure())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1125 error("pure function '%s' cannot call impure function '%s'\n",
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1126 sc->func->toChars(), f->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1127 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1128 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1129
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1130 /********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1131 * Check for expressions that have no use.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1132 * Input:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1133 * flag 0 not going to use the result, so issue error message if no
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1134 * side effects
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1135 * 1 the result of the expression is used, but still check
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1136 * for useless subexpressions
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1137 * 2 do not issue error messages, just return !=0 if expression
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1138 * has side effects
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1139 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1140
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1141 int Expression::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1142 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1143 if (flag == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1144 { if (op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1145 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1146 error("%s has no effect", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1147 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1148 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1149 error("%s has no effect in expression (%s)",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1150 Token::toChars(op), toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1151 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1152 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1153 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1154
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1155 /*****************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1156 * Check that expression can be tested for true or false.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1157 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1158
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1159 Expression *Expression::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1160 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1161 // Default is 'yes' - do nothing
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1163 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1164 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1165 dump(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1166 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1167
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1168 if (!type->checkBoolean())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1169 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1170 error("expression %s of type %s does not have a boolean value", toChars(), type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1171 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1172 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1173 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1174
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1175 /****************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1176 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1177
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1178 Expression *Expression::checkToPointer()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1179 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1180 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1181 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1182
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1183 //printf("Expression::checkToPointer()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1184 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1186 // If C static array, convert to pointer
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1187 tb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1188 if (tb->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1189 { TypeSArray *ts = (TypeSArray *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1190 if (ts->size(loc) == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1191 e = new NullExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1192 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1193 e = new AddrExp(loc, this);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1194 e->type = ts->next->pointerTo();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1195 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1196 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1197 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1198
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1199 /******************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1200 * Take address of expression.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1201 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1203 Expression *Expression::addressOf(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1204 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1205 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1206
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1207 //printf("Expression::addressOf()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1208 e = toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1209 e = new AddrExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1210 e->type = type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1211 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1212 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1213
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1214 /******************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1215 * If this is a reference, dereference it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1216 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1218 Expression *Expression::deref()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1219 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1220 //printf("Expression::deref()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1221 if (type->ty == Treference)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1222 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1223
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1224 e = new PtrExp(loc, this);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1225 e->type = ((TypeReference *)type)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1226 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1227 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1228 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1229 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1231 /********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1232 * Does this expression statically evaluate to a boolean TRUE or FALSE?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1233 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1234
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1235 int Expression::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1236 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1237 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1238 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1239
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1240 /********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1241 * Does this expression result in either a 1 or a 0?
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1242 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1243
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1244 int Expression::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1245 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1246 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1247 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1248
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1249 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1250 * Can this expression throw an exception?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1251 * Valid only after semantic() pass.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1252 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1253
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1254 int Expression::canThrow()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1255 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1256 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1257 return FALSE;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1258 #else
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1259 return TRUE;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1260 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1261 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1262
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1263
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1264
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1265 Expressions *Expression::arraySyntaxCopy(Expressions *exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1266 { Expressions *a = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1268 if (exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1269 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1270 a = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1271 a->setDim(exps->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1272 for (int i = 0; i < a->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1273 { Expression *e = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1275 e = e->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1276 a->data[i] = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1279 return a;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1282 /******************************** IntegerExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1283
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1284 IntegerExp::IntegerExp(Loc loc, integer_t value, Type *type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1285 : Expression(loc, TOKint64, sizeof(IntegerExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1286 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1287 //printf("IntegerExp(value = %lld, type = '%s')\n", value, type ? type->toChars() : "");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1288 if (type && !type->isscalar())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1289 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1290 //printf("%s, loc = %d\n", toChars(), loc.linnum);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1291 error("integral constant must be scalar type, not %s", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1292 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1293 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1294 this->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1295 this->value = value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1296 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1297
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1298 IntegerExp::IntegerExp(integer_t value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1299 : Expression(0, TOKint64, sizeof(IntegerExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1300 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1301 this->type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1302 this->value = value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1303 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1305 int IntegerExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1306 { IntegerExp *ne;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1307
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1308 if (this == o ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1309 (((Expression *)o)->op == TOKint64 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1310 ((ne = (IntegerExp *)o), type->equals(ne->type)) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1311 value == ne->value))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1312 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1313 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1314 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1315
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1316 char *IntegerExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1317 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1318 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1319 return Expression::toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1320 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1321 static char buffer[sizeof(value) * 3 + 1];
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1322 sprintf(buffer, "%lld", value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1323 return buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1324 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1325 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1326
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1327 integer_t IntegerExp::toInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1328 { Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1329
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1330 t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1331 while (t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1332 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1333 switch (t->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1335 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1336 case Tbool: value = (value != 0); break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1337 case Tint8: value = (d_int8) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1338 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1339 case Tuns8: value = (d_uns8) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1340 case Tint16: value = (d_int16) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1341 case Twchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1342 case Tuns16: value = (d_uns16) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1343 case Tint32: value = (d_int32) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1344 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1345 case Tdchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1346 case Tuns32: value = (d_uns32) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1347 case Tint64: value = (d_int64) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1348 case Tuns64: value = (d_uns64) value; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1350 case Tenum:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1351 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1352 TypeEnum *te = (TypeEnum *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1353 t = te->sym->memtype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1354 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1357 case Ttypedef:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1358 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1359 TypeTypedef *tt = (TypeTypedef *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1360 t = tt->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1361 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1362 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1363
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1364 default:
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1365 /* This can happen if errors, such as
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1366 * the type is painted on like in fromConstInitializer().
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1367 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1368 if (!global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1369 { type->print();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1370 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1371 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1372 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1374 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1375 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1376 return value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1377 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1378
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1379 real_t IntegerExp::toReal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1380 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1381 Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1382
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1383 toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1384 t = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1385 if (t->ty == Tuns64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1386 return (real_t)(d_uns64)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1387 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1388 return (real_t)(d_int64)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1389 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1391 real_t IntegerExp::toImaginary()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1392 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1393 return (real_t) 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1396 complex_t IntegerExp::toComplex()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1397 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1398 return toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1399 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1400
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1401 int IntegerExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1403 return result ? value != 0 : value == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1404 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1406 Expression *IntegerExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1407 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1408 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1409 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1410 // Determine what the type of this number is
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1411 integer_t number = value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1412
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1413 if (number & 0x8000000000000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1414 type = Type::tuns64;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1415 else if (number & 0xFFFFFFFF80000000LL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1416 type = Type::tint64;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1417 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1418 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1419 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1420 else
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1421 { if (!type->deco)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1422 type = type->semantic(loc, sc);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1423 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1424 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1425 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1426
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1427 Expression *IntegerExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1428 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1429 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1430 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1431 else if (!loc.filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1432 loc = e->loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1433 e->error("constant %s is not an lvalue", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1434 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1435 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1436
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1437 void IntegerExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1438 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1439 integer_t v = toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1440
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1441 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1442 { Type *t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1443
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1444 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1445 switch (t->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1446 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1447 case Tenum:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1448 { TypeEnum *te = (TypeEnum *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1449 buf->printf("cast(%s)", te->sym->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1450 t = te->sym->memtype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1451 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1452 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1453
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1454 case Ttypedef:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1455 { TypeTypedef *tt = (TypeTypedef *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1456 buf->printf("cast(%s)", tt->sym->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1457 t = tt->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1458 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1459 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1460
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1461 case Twchar: // BUG: need to cast(wchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1462 case Tdchar: // BUG: need to cast(dchar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1463 if ((uinteger_t)v > 0xFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1464 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1465 buf->printf("'\\U%08x'", v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1466 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1467 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1468 case Tchar:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1469 if (v == '\'')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1470 buf->writestring("'\\''");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1471 else if (isprint(v) && v != '\\')
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1472 buf->printf("'%c'", (int)v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1473 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1474 buf->printf("'\\x%02x'", (int)v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1475 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1476
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1477 case Tint8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1478 buf->writestring("cast(byte)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1479 goto L2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1480
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1481 case Tint16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1482 buf->writestring("cast(short)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1483 goto L2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1484
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1485 case Tint32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1486 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1487 buf->printf("%d", (int)v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1488 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1489
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1490 case Tuns8:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1491 buf->writestring("cast(ubyte)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1492 goto L3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1493
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1494 case Tuns16:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1495 buf->writestring("cast(ushort)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1496 goto L3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1497
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1498 case Tuns32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1499 L3:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1500 buf->printf("%du", (unsigned)v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1501 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1503 case Tint64:
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1504 buf->printf("%lldL", v);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1505 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1506
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1507 case Tuns64:
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1508 buf->printf("%lluLU", v);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1509 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1510
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1511 case Tbit:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1512 case Tbool:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1513 buf->writestring((char *)(v ? "true" : "false"));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1514 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1515
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1516 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1517 buf->writestring("cast(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1518 buf->writestring(t->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1519 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1520 goto L3;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1521
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1522 default:
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1523 /* This can happen if errors, such as
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1524 * the type is painted on like in fromConstInitializer().
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1525 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1526 if (!global.errors)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1527 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1528 #ifdef DEBUG
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1529 t->print();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1530 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1531 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1532 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
1533 break;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1534 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1535 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1536 else if (v & 0x8000000000000000LL)
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1537 buf->printf("0x%llx", v);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1538 else
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1539 buf->printf("%lld", v);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1540 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1541
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1542 void IntegerExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1543 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1544 if ((sinteger_t)value < 0)
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1545 buf->printf("N%lld", -value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1546 else
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
1547 buf->printf("%lld", value);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1548 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1549
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1550 /******************************** RealExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1551
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1552 RealExp::RealExp(Loc loc, real_t value, Type *type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1553 : Expression(loc, TOKfloat64, sizeof(RealExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1554 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1555 //printf("RealExp::RealExp(%Lg)\n", value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1556 this->value = value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1557 this->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1558 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1559
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1560 char *RealExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1561 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1562 char buffer[sizeof(value) * 3 + 8 + 1 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1563
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1564 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1565 value.format(buffer, sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1566 if (type->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1567 strcat(buffer, "i");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1568 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1569 sprintf(buffer, type->isimaginary() ? "%Lgi" : "%Lg", value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1570 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1571 assert(strlen(buffer) < sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1572 return mem.strdup(buffer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1575 integer_t RealExp::toInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1576 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1577 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1578 return toReal().toInt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1579 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1580 return (sinteger_t) toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1581 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1582 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1583
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1584 uinteger_t RealExp::toUInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1585 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1586 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1587 return (uinteger_t) toReal().toInt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1588 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1589 return (uinteger_t) toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1590 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1591 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1593 real_t RealExp::toReal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1594 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1595 return type->isreal() ? value : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1596 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1597
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1598 real_t RealExp::toImaginary()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1599 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1600 return type->isreal() ? 0 : value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1603 complex_t RealExp::toComplex()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1604 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1605 #ifdef __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1606 return toReal() + toImaginary() * I;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1607 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1608 return complex_t(toReal(), toImaginary());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1609 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1610 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1611
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1612 /********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1613 * Test to see if two reals are the same.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1614 * Regard NaN's as equivalent.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1615 * Regard +0 and -0 as different.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1616 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1617
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1618 int RealEquals(real_t x1, real_t x2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1619 {
421
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1620 return // special case nans
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1621 (isnan(x1) && isnan(x2)) ||
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1622 // and zero, in order to distinguish +0 from -0
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1623 (x1 == 0 && x2 == 0 && 1./x1 == 1./x2) ||
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1624 // otherwise just compare
1c65b5477eaa Fix real comparison for real: allow +0 to be distinguished from -0.
Christian Kamm <kamm incasoftware de>
parents: 420
diff changeset
1625 (x1 != 0. && x1 == x2);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1626 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1627
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1628 int RealExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1629 { RealExp *ne;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1630
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1631 if (this == o ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1632 (((Expression *)o)->op == TOKfloat64 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1633 ((ne = (RealExp *)o), type->equals(ne->type)) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1634 RealEquals(value, ne->value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1635 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1636 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1637 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1638 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1639 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1640
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1641 Expression *RealExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1642 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1643 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1644 type = Type::tfloat64;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1645 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1646 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1647 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1648 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1649
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1650 int RealExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1651 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1652 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1653 return result ? (! value.isZero()) : (value.isZero());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1654 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1655 return result ? (value != 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1656 : (value == 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1657 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1658 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1659
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1660 void floatToBuffer(OutBuffer *buf, Type *type, real_t value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1661 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1662 /* In order to get an exact representation, try converting it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1663 * to decimal then back again. If it matches, use it.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1664 * If it doesn't, fall back to hex, which is
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1665 * always exact.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1666 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1667 char buffer[25];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1668 sprintf(buffer, "%Lg", value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1669 assert(strlen(buffer) < sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1670 #if _WIN32 && __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1671 char *save = __locale_decpoint;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1672 __locale_decpoint = ".";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1673 real_t r = strtold(buffer, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1674 __locale_decpoint = save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1675 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1676 real_t r = strtold(buffer, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1677 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1678 if (r == value) // if exact duplication
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1679 buf->writestring(buffer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1680 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1681 buf->printf("%La", value); // ensure exact duplication
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1682
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1683 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1684 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1685 Type *t = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1686 switch (t->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1687 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1688 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1689 case Timaginary32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1690 case Tcomplex32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1691 buf->writeByte('F');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1692 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1693
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1694 case Tfloat80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1695 case Timaginary80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1696 case Tcomplex80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1697 buf->writeByte('L');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1698 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1699
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1700 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1701 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1702 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1703 if (t->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1704 buf->writeByte('i');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1705 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1706 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1707
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1708 void RealExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1709 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1710 floatToBuffer(buf, type, value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1711 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1712
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1713 void realToMangleBuffer(OutBuffer *buf, real_t value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1714 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1715 /* Rely on %A to get portable mangling.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1716 * Must munge result to get only identifier characters.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1717 *
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1718 * Possible values from %A => mangled result
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1719 * NAN => NAN
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1720 * -INF => NINF
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1721 * INF => INF
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1722 * -0X1.1BC18BA997B95P+79 => N11BC18BA997B95P79
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1723 * 0X1.9P+2 => 19P2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1724 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1725
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1726 if (isnan(value))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1727 buf->writestring("NAN"); // no -NAN bugs
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1728 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1729 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1730 char buffer[32];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1731 int n = sprintf(buffer, "%LA", value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1732 assert(n > 0 && n < sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1733 for (int i = 0; i < n; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1734 { char c = buffer[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1735
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1736 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1737 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1738 case '-':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1739 buf->writeByte('N');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1740 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1741
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1742 case '+':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1743 case 'X':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1744 case '.':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1745 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1746
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1747 case '0':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1748 if (i < 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1749 break; // skip leading 0X
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1750 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1751 buf->writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1752 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1753 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1754 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1755 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1756 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1758 void RealExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1759 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1760 buf->writeByte('e');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1761 realToMangleBuffer(buf, value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1762 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1763
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1764
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1765 /******************************** ComplexExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1766
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1767 ComplexExp::ComplexExp(Loc loc, complex_t value, Type *type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1768 : Expression(loc, TOKcomplex80, sizeof(ComplexExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1769 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1770 this->value = value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1771 this->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1772 //printf("ComplexExp::ComplexExp(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1773 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1774
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1775 char *ComplexExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1776 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1777 char buffer[sizeof(value) * 3 + 8 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1778
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1779 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1780 char buf1[sizeof(value) * 3 + 8 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1781 char buf2[sizeof(value) * 3 + 8 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1782 creall(value).format(buf1, sizeof(buf1));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1783 cimagl(value).format(buf2, sizeof(buf2));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1784 sprintf(buffer, "(%s+%si)", buf1, buf2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1785 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1786 sprintf(buffer, "(%Lg+%Lgi)", creall(value), cimagl(value));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1787 assert(strlen(buffer) < sizeof(buffer));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1788 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1789 return mem.strdup(buffer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1790 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1791
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1792 integer_t ComplexExp::toInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1793 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1794 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1795 return (sinteger_t) toReal().toInt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1796 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1797 return (sinteger_t) toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1798 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1799 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1800
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1801 uinteger_t ComplexExp::toUInteger()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1802 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1803 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1804 return (uinteger_t) toReal().toInt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1805 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1806 return (uinteger_t) toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1807 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1808 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1809
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1810 real_t ComplexExp::toReal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1811 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1812 return creall(value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1813 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1814
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1815 real_t ComplexExp::toImaginary()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1816 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1817 return cimagl(value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1818 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1819
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1820 complex_t ComplexExp::toComplex()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1821 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1822 return value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1823 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1824
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1825 int ComplexExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1826 { ComplexExp *ne;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1827
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1828 if (this == o ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1829 (((Expression *)o)->op == TOKcomplex80 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1830 ((ne = (ComplexExp *)o), type->equals(ne->type)) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1831 RealEquals(creall(value), creall(ne->value)) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1832 RealEquals(cimagl(value), cimagl(ne->value))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1833 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1834 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1835 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1836 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1837 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1838
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1839 Expression *ComplexExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1840 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1841 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1842 type = Type::tcomplex80;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1843 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1844 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1845 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1846 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1847
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1848 int ComplexExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1849 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1850 if (result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1851 return (bool)(value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1852 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1853 return !value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1854 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1855
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1856 void ComplexExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1857 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1858 /* Print as:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1859 * (re+imi)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1860 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1861 #ifdef IN_GCC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1862 char buf1[sizeof(value) * 3 + 8 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1863 char buf2[sizeof(value) * 3 + 8 + 1];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1864 creall(value).format(buf1, sizeof(buf1));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1865 cimagl(value).format(buf2, sizeof(buf2));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1866 buf->printf("(%s+%si)", buf1, buf2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1867 #else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1868 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1869 floatToBuffer(buf, type, creall(value));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1870 buf->writeByte('+');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1871 floatToBuffer(buf, type, cimagl(value));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1872 buf->writestring("i)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1873 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1874 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1875
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1876 void ComplexExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1877 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1878 buf->writeByte('c');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1879 real_t r = toReal();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1880 realToMangleBuffer(buf, r);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1881 buf->writeByte('c'); // separate the two
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1882 r = toImaginary();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1883 realToMangleBuffer(buf, r);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1884 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1885
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1886 /******************************** IdentifierExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1888 IdentifierExp::IdentifierExp(Loc loc, Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1889 : Expression(loc, TOKidentifier, sizeof(IdentifierExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1890 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1891 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1892 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1893
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1894 Expression *IdentifierExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1895 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1896 Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1897 Dsymbol *scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1898
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1899 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1900 printf("IdentifierExp::semantic('%s')\n", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1901 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1902 s = sc->search(loc, ident, &scopesym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1903 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1904 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1905 WithScopeSymbol *withsym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1906
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1907 /* See if the symbol was a member of an enclosing 'with'
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1908 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1909 withsym = scopesym->isWithScopeSymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1910 if (withsym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1911 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1912 s = s->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1913
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1914 // Same as wthis.ident
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1915 if (s->needThis() || s->isTemplateDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1916 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1917 e = new VarExp(loc, withsym->withstate->wthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1918 e = new DotIdExp(loc, e, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1919 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1920 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1921 { Type *t = withsym->withstate->wthis->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1922 if (t->ty == Tpointer)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
1923 t = ((TypePointer *)t)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1924 e = new TypeDotIdExp(loc, t, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1925 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1926 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1927 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1928 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1929 if (!s->parent && scopesym->isArrayScopeSymbol())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1930 { // Kludge to run semantic() here because
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1931 // ArrayScopeSymbol::search() doesn't have access to sc.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1932 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1933 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1934 /* If f is really a function template,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1935 * then replace f with the function template declaration.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1936 */
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1937 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1938 if (f && f->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1939 { TemplateInstance *ti = f->parent->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1940
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1941 if (ti &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1942 !ti->isTemplateMixin() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1943 (ti->name == f->ident ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1944 ti->toAlias()->ident == f->ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1945 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1946 ti->tempdecl && ti->tempdecl->onemember)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1947 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1948 TemplateDeclaration *tempdecl = ti->tempdecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1949 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1950 tempdecl = tempdecl->overroot; // then get the start
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1951 e = new TemplateExp(loc, tempdecl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1952 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1953 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1954 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1955 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1956 e = new DsymbolExp(loc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1957 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1958 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1959 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1960 error("undefined identifier %s", ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1961 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1962 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1963 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1964
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1965 char *IdentifierExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1966 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1967 return ident->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1968 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1969
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1970 void IdentifierExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1971 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1972 if (hgs->hdrgen)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1973 buf->writestring(ident->toHChars2());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1974 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1975 buf->writestring(ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1976 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1977
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1978 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1979 int IdentifierExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1980 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1981 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1982 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1983 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
1984
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1985 Expression *IdentifierExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1986 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1987 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1988 tym = tybasic(e1->ET->Tty);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1989 if (!(tyscalar(tym) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1990 tym == TYstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1991 tym == TYarray && e->Eoper == TOKaddr))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1992 synerr(EM_lvalue); // lvalue expected
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1993 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1994 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1995 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1996
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1997 /******************************** DollarExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1998
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
1999 DollarExp::DollarExp(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2000 : IdentifierExp(loc, Id::dollar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2001 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2002 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2003
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2004 /******************************** DsymbolExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2005
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2006 DsymbolExp::DsymbolExp(Loc loc, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2007 : Expression(loc, TOKdsymbol, sizeof(DsymbolExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2008 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2009 this->s = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2010 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2011
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2012 Expression *DsymbolExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2013 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2014 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2015 printf("DsymbolExp::semantic('%s')\n", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2016 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2017
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2018 Lagain:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2019 EnumMember *em;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2020 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2021 VarDeclaration *v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2022 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2023 FuncLiteralDeclaration *fld;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2024 Declaration *d;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2025 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2026 ClassDeclaration *thiscd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2027 Import *imp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2028 Package *pkg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2029 Type *t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2030
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2031 //printf("DsymbolExp:: %p '%s' is a symbol\n", this, toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2032 //printf("s = '%s', s->kind = '%s'\n", s->toChars(), s->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2033 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2034 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2035 if (!s->isFuncDeclaration()) // functions are checked after overloading
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2036 checkDeprecated(sc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2037 s = s->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2038 //printf("s = '%s', s->kind = '%s', s->needThis() = %p\n", s->toChars(), s->kind(), s->needThis());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2039 if (!s->isFuncDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2040 checkDeprecated(sc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2041
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2042 if (sc->func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2043 thiscd = sc->func->parent->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2044
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2045 // BUG: This should happen after overload resolution for functions, not before
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2046 if (s->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2047 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2048 if (hasThis(sc)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2049 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2050 && !s->isFuncDeclaration()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2051 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2052 )
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2053 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2054 // Supply an implicit 'this', as in
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2055 // this.ident
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2056
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2057 DotVarExp *de;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2059 de = new DotVarExp(loc, new ThisExp(loc), s->isDeclaration());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2060 return de->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2061 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2062 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2063
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2064 em = s->isEnumMember();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2065 if (em)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2066 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2067 e = em->value->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2068 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2069 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2070 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2071 v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2072 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2073 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2074 //printf("Identifier '%s' is a variable, type '%s'\n", toChars(), v->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2075 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2076 { type = v->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2077 if (!v->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2078 { error("forward reference of %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2079 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2080 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2081 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2082 if (v->isConst() && type->toBasetype()->ty != Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2083 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2084 if (v->init)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2085 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2086 if (v->inuse)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2087 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2088 error("circular reference to '%s'", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2089 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2090 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2091 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2092 ExpInitializer *ei = v->init->isExpInitializer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2093 if (ei)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2094 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2095 e = ei->exp->copy(); // make copy so we can change loc
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2096 if (e->op == TOKstring || !e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2097 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2098 e = e->implicitCastTo(sc, type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2099 e->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2100 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2101 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2102 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2103 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2104 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2105 e = type->defaultInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2106 e->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2107 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2110 e = new VarExp(loc, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2111 e->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2112 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2113 return e->deref();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2114 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2115 fld = s->isFuncLiteralDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2116 if (fld)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2117 { //printf("'%s' is a function literal\n", fld->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2118 e = new FuncExp(loc, fld);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2119 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2120 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2121 f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2122 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2123 { //printf("'%s' is a function\n", f->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2124 return new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2125 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2126 cd = s->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2127 if (cd && thiscd && cd->isBaseOf(thiscd, NULL) && sc->func->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2128 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2129 // We need to add an implicit 'this' if cd is this class or a base class.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2130 DotTypeExp *dte;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2132 dte = new DotTypeExp(loc, new ThisExp(loc), s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2133 return dte->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2134 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2135 imp = s->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2136 if (imp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2138 ScopeExp *ie;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2139
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2140 ie = new ScopeExp(loc, imp->pkg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2141 return ie->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2142 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2143 pkg = s->isPackage();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2144 if (pkg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2145 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2146 ScopeExp *ie;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2147
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2148 ie = new ScopeExp(loc, pkg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2149 return ie->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2150 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2151 Module *mod = s->isModule();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2152 if (mod)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2153 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2154 ScopeExp *ie;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2156 ie = new ScopeExp(loc, mod);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2157 return ie->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2158 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2160 t = s->getType();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2161 if (t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2162 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2163 return new TypeExp(loc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2164 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2166 TupleDeclaration *tup = s->isTupleDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2167 if (tup)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2168 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2169 e = new TupleExp(loc, tup);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2170 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2171 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2172 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2174 TemplateInstance *ti = s->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2175 if (ti && !global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2176 { if (!ti->semanticdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2177 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2178 s = ti->inst->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2179 if (!s->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2180 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2181 e = new ScopeExp(loc, ti);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2182 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2183 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2184 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2186 TemplateDeclaration *td = s->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2187 if (td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2188 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2189 e = new TemplateExp(loc, td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2190 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2191 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2192 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2193
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2194 Lerr:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2195 error("%s '%s' is not a variable", s->kind(), s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2196 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2197 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2198 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2199
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2200 char *DsymbolExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2201 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2202 return s->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2203 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2204
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2205 void DsymbolExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2206 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2207 buf->writestring(s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2208 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2209
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2210 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2211 int DsymbolExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2212 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2213 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2214 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2215 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2216
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2217 Expression *DsymbolExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2218 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2219 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2220 tym = tybasic(e1->ET->Tty);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2221 if (!(tyscalar(tym) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2222 tym == TYstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2223 tym == TYarray && e->Eoper == TOKaddr))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2224 synerr(EM_lvalue); // lvalue expected
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2225 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2226 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2227 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2228
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2229 /******************************** ThisExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2231 ThisExp::ThisExp(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2232 : Expression(loc, TOKthis, sizeof(ThisExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2233 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2234 var = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2235 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2236
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2237 Expression *ThisExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2238 { FuncDeclaration *fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2239 FuncDeclaration *fdthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2240 int nested = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2241
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2242 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2243 printf("ThisExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2244 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2245 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2246 { //assert(global.errors || var);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2247 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2248 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2249
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2250 /* Special case for typeof(this) and typeof(super) since both
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2251 * should work even if they are not inside a non-static member function
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2252 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2253 if (sc->intypeof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2254 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2255 // Find enclosing struct or class
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2256 for (Dsymbol *s = sc->parent; 1; s = s->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2257 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2258 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2259 StructDeclaration *sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2260
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2261 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2262 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2263 error("%s is not in a struct or class scope", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2264 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2265 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2266 cd = s->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2267 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2268 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2269 type = cd->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2270 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2272 sd = s->isStructDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2273 if (sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2274 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2275 type = sd->type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2276 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2277 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2279 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2280
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2281 fdthis = sc->parent->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2282 fd = hasThis(sc); // fd is the uplevel function with the 'this' variable
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2283 if (!fd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2284 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2285
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2286 assert(fd->vthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2287 var = fd->vthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2288 assert(var->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2289 type = var->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2290 var->isVarDeclaration()->checkNestedReference(sc, loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2291 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2292 if (fd != fdthis) // if nested
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2293 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2294 fdthis->getLevel(loc, fd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2295 fd->vthis->nestedref = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2296 fd->nestedFrameRef = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2297 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2298 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
2299 if (!sc->intypeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
2300 sc->callSuper |= CSXthis;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2301 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2303 Lerr:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
2304 error("'this' is only defined in non-static member functions, not %s", sc->parent->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
2305 type = Type::terror;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2306 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2307 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2308
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2309 int ThisExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2310 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2311 return result ? TRUE : FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2314 void ThisExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2315 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2316 buf->writestring("this");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2317 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2318
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2319 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2320 int ThisExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2321 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2322 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2323 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2324 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2325
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2326 Expression *ThisExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2327 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2328 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2329 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2330
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2331 /******************************** SuperExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2332
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2333 SuperExp::SuperExp(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2334 : ThisExp(loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2335 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2336 op = TOKsuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2338
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2339 Expression *SuperExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2340 { FuncDeclaration *fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2341 FuncDeclaration *fdthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2342 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2343 Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2345 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2346 printf("SuperExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2347 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2348 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2349 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2350
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2351 /* Special case for typeof(this) and typeof(super) since both
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2352 * should work even if they are not inside a non-static member function
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2353 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2354 if (sc->intypeof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2355 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2356 // Find enclosing class
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2357 for (Dsymbol *s = sc->parent; 1; s = s->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2358 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2359 ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2360
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2361 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2362 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2363 error("%s is not in a class scope", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2364 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2366 cd = s->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2367 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2368 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2369 cd = cd->baseClass;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2370 if (!cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2371 { error("class %s has no 'super'", s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2372 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2373 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2374 type = cd->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2375 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2376 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2377 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2378 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2379
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2380 fdthis = sc->parent->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2381 fd = hasThis(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2382 if (!fd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2383 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2384 assert(fd->vthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2385 var = fd->vthis;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2386 assert(var->parent);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2387
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2388 s = fd->toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2389 while (s && s->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2390 s = s->toParent();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2391 assert(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2392 cd = s->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2393 //printf("parent is %s %s\n", fd->toParent()->kind(), fd->toParent()->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2394 if (!cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2395 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2396 if (!cd->baseClass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2397 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2398 error("no base class for %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2399 type = fd->vthis->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2401 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2403 type = cd->baseClass->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2404 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2406 var->isVarDeclaration()->checkNestedReference(sc, loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2407 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2408 if (fd != fdthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2409 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2410 fdthis->getLevel(loc, fd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2411 fd->vthis->nestedref = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2412 fd->nestedFrameRef = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2413 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2414 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2415
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
2416 if (!sc->intypeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
2417 sc->callSuper |= CSXsuper;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2418 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2419
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2420
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2421 Lerr:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2422 error("'super' is only allowed in non-static class member functions");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2423 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2424 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2425 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2426
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2427 void SuperExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2428 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2429 buf->writestring("super");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2430 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2431
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2432
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2433 /******************************** NullExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2434
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2435 NullExp::NullExp(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2436 : Expression(loc, TOKnull, sizeof(NullExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2438 committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2439 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2440
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2441 Expression *NullExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2442 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2443 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2444 printf("NullExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2445 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2446 // NULL is the same as (void *)0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2447 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2448 type = Type::tvoid->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2449 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2450 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2451
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2452 int NullExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2453 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2454 return result ? FALSE : TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2455 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2456
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2457 void NullExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2458 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2459 buf->writestring("null");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2462 void NullExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2463 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2464 buf->writeByte('n');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2465 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2466
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2467 /******************************** StringExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2468
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2469 StringExp::StringExp(Loc loc, char *string)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2470 : Expression(loc, TOKstring, sizeof(StringExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2471 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2472 this->string = string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2473 this->len = strlen(string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2474 this->sz = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2475 this->committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2476 this->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2477 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2478
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2479 StringExp::StringExp(Loc loc, void *string, size_t len)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2480 : Expression(loc, TOKstring, sizeof(StringExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2482 this->string = string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2483 this->len = len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2484 this->sz = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2485 this->committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2486 this->postfix = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2487 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2488
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2489 StringExp::StringExp(Loc loc, void *string, size_t len, unsigned char postfix)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2490 : Expression(loc, TOKstring, sizeof(StringExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2491 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2492 this->string = string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2493 this->len = len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2494 this->sz = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2495 this->committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2496 this->postfix = postfix;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2497 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2498
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2499 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2500 Expression *StringExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2501 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2502 printf("StringExp::syntaxCopy() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2503 return copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2504 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2505 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2506
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2507 int StringExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2508 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2509 //printf("StringExp::equals('%s')\n", o->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2510 if (o && o->dyncast() == DYNCAST_EXPRESSION)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2511 { Expression *e = (Expression *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2512
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2513 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2514 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2515 return compare(o) == 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2516 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2517 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2518 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2519 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2520
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2521 char *StringExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2522 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2523 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2524 HdrGenState hgs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2525 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2526
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2527 memset(&hgs, 0, sizeof(hgs));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2528 toCBuffer(&buf, &hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2529 buf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2530 p = (char *)buf.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2531 buf.data = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2532 return p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2533 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2534
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2535 Expression *StringExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2536 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2537 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2538 printf("StringExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2539 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2540 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2541 { OutBuffer buffer;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2542 size_t newlen = 0;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2543 const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2544 size_t u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2545 unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2546
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2547 switch (postfix)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2548 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2549 case 'd':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2550 for (u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2551 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2552 p = utf_decodeChar((unsigned char *)string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2553 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2554 { error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2555 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2556 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2557 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2558 { buffer.write4(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2559 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2560 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2561 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2562 buffer.write4(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2563 string = buffer.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2564 len = newlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2565 sz = 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2566 type = new TypeSArray(Type::tdchar, new IntegerExp(loc, len, Type::tindex));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2567 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2568 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2569
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2570 case 'w':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2571 for (u = 0; u < len;)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2572 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2573 p = utf_decodeChar((unsigned char *)string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2574 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2575 { error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2576 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2577 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2578 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2579 { buffer.writeUTF16(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2580 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2581 if (c >= 0x10000)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2582 newlen++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2583 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2585 buffer.writeUTF16(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2586 string = buffer.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2587 len = newlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2588 sz = 2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2589 type = new TypeSArray(Type::twchar, new IntegerExp(loc, len, Type::tindex));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2590 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2591 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2592
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2593 case 'c':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2594 committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2595 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2596 type = new TypeSArray(Type::tchar, new IntegerExp(loc, len, Type::tindex));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2597 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2598 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2599 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2600 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2601 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2602 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2603
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2604 /****************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2605 * Convert string to char[].
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2606 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2607
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2608 StringExp *StringExp::toUTF8(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2609 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2610 if (sz != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2611 { // Convert to UTF-8 string
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2612 committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2613 Expression *e = castTo(sc, Type::tchar->arrayOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2614 e = e->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2615 assert(e->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2616 StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2617 assert(se->sz == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2618 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2619 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2620 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2621 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2622
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2623 int StringExp::compare(Object *obj)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2624 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2625 // Used to sort case statement expressions so we can do an efficient lookup
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2626 StringExp *se2 = (StringExp *)(obj);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2627
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2628 // This is a kludge so isExpression() in template.c will return 5
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2629 // for StringExp's.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2630 if (!se2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2631 return 5;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2632
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2633 assert(se2->op == TOKstring);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2634
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2635 int len1 = len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2636 int len2 = se2->len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2637
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2638 if (len1 == len2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2639 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2640 switch (sz)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2641 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2642 case 1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2643 return strcmp((char *)string, (char *)se2->string);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2644
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2645 case 2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2646 { unsigned u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2647 d_wchar *s1 = (d_wchar *)string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2648 d_wchar *s2 = (d_wchar *)se2->string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2649
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2650 for (u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2651 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2652 if (s1[u] != s2[u])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2653 return s1[u] - s2[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2654 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2655 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2656
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2657 case 4:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2658 { unsigned u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2659 d_dchar *s1 = (d_dchar *)string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2660 d_dchar *s2 = (d_dchar *)se2->string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2661
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2662 for (u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2663 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2664 if (s1[u] != s2[u])
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2665 return s1[u] - s2[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2666 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2667 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2668 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2669
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2670 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2671 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2672 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2673 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2674 return len1 - len2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2675 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2676
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2677 int StringExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2678 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2679 return result ? TRUE : FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2680 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2681
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2682 unsigned StringExp::charAt(size_t i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2683 { unsigned value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2684
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2685 switch (sz)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2686 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2687 case 1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2688 value = ((unsigned char *)string)[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2689 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2690
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2691 case 2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2692 value = ((unsigned short *)string)[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2693 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2694
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2695 case 4:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2696 value = ((unsigned int *)string)[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2697 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2698
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2699 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2700 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2701 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2702 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2703 return value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2704 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2705
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2706 void StringExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2707 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2708 buf->writeByte('"');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2709 for (size_t i = 0; i < len; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2710 { unsigned c = charAt(i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2711
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2712 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2713 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2714 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2715 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2716 if (!hgs->console)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2717 buf->writeByte('\\');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2718 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2719 if (c <= 0xFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2720 { if (c <= 0x7F && (isprint(c) || hgs->console))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2721 buf->writeByte(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2722 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2723 buf->printf("\\x%02x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2724 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2725 else if (c <= 0xFFFF)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2726 buf->printf("\\x%02x\\x%02x", c & 0xFF, c >> 8);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2727 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2728 buf->printf("\\x%02x\\x%02x\\x%02x\\x%02x",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2729 c & 0xFF, (c >> 8) & 0xFF, (c >> 16) & 0xFF, c >> 24);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2730 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2731 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2732 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2733 buf->writeByte('"');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2734 if (postfix)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2735 buf->writeByte(postfix);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2736 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2737
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2738 void StringExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2739 { char m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2740 OutBuffer tmp;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2741 const char *p;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2742 unsigned c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2743 size_t u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2744 unsigned char *q;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2745 unsigned qlen;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2746
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2747 /* Write string in UTF-8 format
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2748 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2749 switch (sz)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2750 { case 1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2751 m = 'a';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2752 q = (unsigned char *)string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2753 qlen = len;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2754 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2755 case 2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2756 m = 'w';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2757 for (u = 0; u < len; )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2758 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2759 p = utf_decodeWchar((unsigned short *)string, len, &u, &c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2760 if (p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2761 error("%s", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2762 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2763 tmp.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2764 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2765 q = tmp.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2766 qlen = tmp.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2767 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2768 case 4:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2769 m = 'd';
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2770 for (u = 0; u < len; u++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2771 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2772 c = ((unsigned *)string)[u];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2773 if (!utf_isValidDchar(c))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2774 error("invalid UCS-32 char \\U%08x", c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2775 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2776 tmp.writeUTF8(c);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2777 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2778 q = tmp.data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2779 qlen = tmp.offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2780 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2781 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2782 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2783 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2784 buf->writeByte(m);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2785 buf->printf("%d_", qlen);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2786 for (size_t i = 0; i < qlen; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2787 buf->printf("%02x", q[i]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2788 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2789
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2790 /************************ ArrayLiteralExp ************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2791
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2792 // [ e1, e2, e3, ... ]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2793
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2794 ArrayLiteralExp::ArrayLiteralExp(Loc loc, Expressions *elements)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2795 : Expression(loc, TOKarrayliteral, sizeof(ArrayLiteralExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2796 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2797 this->elements = elements;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2798 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2799
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2800 ArrayLiteralExp::ArrayLiteralExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2801 : Expression(loc, TOKarrayliteral, sizeof(ArrayLiteralExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2802 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2803 elements = new Expressions;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2804 elements->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2805 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2806
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2807 Expression *ArrayLiteralExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2808 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2809 return new ArrayLiteralExp(loc, arraySyntaxCopy(elements));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2810 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2811
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2812 Expression *ArrayLiteralExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2813 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2814 Type *t0 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2816 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2817 printf("ArrayLiteralExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2818 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2819 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2820 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2821
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2822 // Run semantic() on each element
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2823 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2824 { e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2825 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2826 elements->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2827 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2828 expandTuples(elements);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2829 for (int i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2830 { e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2831
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2832 if (!e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2833 error("%s has no value", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2834 e = resolveProperties(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2835
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2836 unsigned char committed = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2837 if (e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2838 committed = ((StringExp *)e)->committed;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2839
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2840 if (!t0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2841 { t0 = e->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2842 // Convert any static arrays to dynamic arrays
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2843 if (t0->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2844 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
2845 t0 = ((TypeSArray *)t0)->next->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2846 e = e->implicitCastTo(sc, t0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2847 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2848 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2849 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2850 e = e->implicitCastTo(sc, t0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2851 if (!committed && e->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2852 { StringExp *se = (StringExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2853 se->committed = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2854 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2855 elements->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2856 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2857
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2858 if (!t0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2859 t0 = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2860 type = new TypeSArray(t0, new IntegerExp(elements->dim));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2861 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2862 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2863 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2864
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2865 int ArrayLiteralExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2866 { int f = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2867
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2868 for (size_t i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2869 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2870
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2871 f |= e->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2872 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2873 if (flag == 0 && f == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2874 Expression::checkSideEffect(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2875 return f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2876 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2877
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2878 int ArrayLiteralExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2879 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2880 size_t dim = elements ? elements->dim : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2881 return result ? (dim != 0) : (dim == 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2882 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2883
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2884 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2885 int ArrayLiteralExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2886 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2887 return 1; // because it can fail allocating memory
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2888 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2889 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
2890
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2891 void ArrayLiteralExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2892 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2893 buf->writeByte('[');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2894 argsToCBuffer(buf, elements, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2895 buf->writeByte(']');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2896 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2897
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2898 void ArrayLiteralExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2899 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2900 size_t dim = elements ? elements->dim : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2901 buf->printf("A%u", dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2902 for (size_t i = 0; i < dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2903 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2904 e->toMangleBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2905 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2906 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2907
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2908 /************************ AssocArrayLiteralExp ************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2910 // [ key0 : value0, key1 : value1, ... ]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2911
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2912 AssocArrayLiteralExp::AssocArrayLiteralExp(Loc loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2913 Expressions *keys, Expressions *values)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2914 : Expression(loc, TOKassocarrayliteral, sizeof(AssocArrayLiteralExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2915 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2916 assert(keys->dim == values->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2917 this->keys = keys;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2918 this->values = values;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2919 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2920
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2921 Expression *AssocArrayLiteralExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2922 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2923 return new AssocArrayLiteralExp(loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2924 arraySyntaxCopy(keys), arraySyntaxCopy(values));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2925 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2926
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2927 Expression *AssocArrayLiteralExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2928 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2929 Type *tkey = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2930 Type *tvalue = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2931
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2932 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2933 printf("AssocArrayLiteralExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2934 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2936 // Run semantic() on each element
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2937 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2938 { Expression *key = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2939 Expression *value = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2940
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2941 key = key->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2942 value = value->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2943
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2944 keys->data[i] = (void *)key;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2945 values->data[i] = (void *)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2946 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2947 expandTuples(keys);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2948 expandTuples(values);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2949 if (keys->dim != values->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2950 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2951 error("number of keys is %u, must match number of values %u", keys->dim, values->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2952 keys->setDim(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2953 values->setDim(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2954 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2955 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2956 { Expression *key = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2957 Expression *value = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2958
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2959 if (!key->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2960 error("%s has no value", key->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2961 if (!value->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2962 error("%s has no value", value->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2963 key = resolveProperties(sc, key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2964 value = resolveProperties(sc, value);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2966 if (!tkey)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2967 tkey = key->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2968 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2969 key = key->implicitCastTo(sc, tkey);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2970 keys->data[i] = (void *)key;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2971
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2972 if (!tvalue)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2973 tvalue = value->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2974 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2975 value = value->implicitCastTo(sc, tvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2976 values->data[i] = (void *)value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2977 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2978
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2979 if (!tkey)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2980 tkey = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2981 if (!tvalue)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2982 tvalue = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2983 type = new TypeAArray(tvalue, tkey);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2984 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2985 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2986 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2987
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2988 int AssocArrayLiteralExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2989 { int f = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2990
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2991 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2992 { Expression *key = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2993 Expression *value = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2994
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2995 f |= key->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2996 f |= value->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2997 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2998 if (flag == 0 && f == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
2999 Expression::checkSideEffect(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3000 return f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3001 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3002
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3003 int AssocArrayLiteralExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3004 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3005 size_t dim = keys->dim;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3006 return result ? (dim != 0) : (dim == 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3007 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3008
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3009 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3010 int AssocArrayLiteralExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3011 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3012 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3013 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3014 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3015
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3016 void AssocArrayLiteralExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3017 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3018 buf->writeByte('[');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3019 for (size_t i = 0; i < keys->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3020 { Expression *key = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3021 Expression *value = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3022
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3023 if (i)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3024 buf->writeByte(',');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3025 expToCBuffer(buf, hgs, key, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3026 buf->writeByte(':');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3027 expToCBuffer(buf, hgs, value, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3028 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3029 buf->writeByte(']');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3030 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3031
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3032 void AssocArrayLiteralExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3033 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3034 size_t dim = keys->dim;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3035 buf->printf("A%u", dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3036 for (size_t i = 0; i < dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3037 { Expression *key = (Expression *)keys->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3038 Expression *value = (Expression *)values->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3039
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3040 key->toMangleBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3041 value->toMangleBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3042 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3043 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3044
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3045 /************************ StructLiteralExp ************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3046
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3047 // sd( e1, e2, e3, ... )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3048
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3049 StructLiteralExp::StructLiteralExp(Loc loc, StructDeclaration *sd, Expressions *elements)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3050 : Expression(loc, TOKstructliteral, sizeof(StructLiteralExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3051 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3052 this->sd = sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3053 this->elements = elements;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3054 this->sym = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3055 this->soffset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3056 this->fillHoles = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3057 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3058
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3059 Expression *StructLiteralExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3060 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3061 return new StructLiteralExp(loc, sd, arraySyntaxCopy(elements));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3062 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3063
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3064 Expression *StructLiteralExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3065 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3066
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3067 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3068 printf("StructLiteralExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3069 #endif
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3070 if (type)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3071 return this;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3072
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3073 // Run semantic() on each element
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3074 for (size_t i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3075 { e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3076 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3077 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3078 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3079 elements->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3080 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3081 expandTuples(elements);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3082 size_t offset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3083 for (size_t i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3084 { e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3085 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3086 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3087
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3088 if (!e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3089 error("%s has no value", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3090 e = resolveProperties(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3091 if (i >= sd->fields.dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3092 { error("more initializers than fields of %s", sd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3093 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3094 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3095 Dsymbol *s = (Dsymbol *)sd->fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3096 VarDeclaration *v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3097 assert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3098 if (v->offset < offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3099 error("overlapping initialization for %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3100 offset = v->offset + v->type->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3101
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3102 Type *telem = v->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3103 while (!e->implicitConvTo(telem) && telem->toBasetype()->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3104 { /* Static array initialization, as in:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3105 * T[3][5] = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3106 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3107 telem = telem->toBasetype()->nextOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3109
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3110 e = e->implicitCastTo(sc, telem);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3111
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3112 elements->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3113 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3114
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3115 /* Fill out remainder of elements[] with default initializers for fields[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3116 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3117 for (size_t i = elements->dim; i < sd->fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3118 { Dsymbol *s = (Dsymbol *)sd->fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3119 VarDeclaration *v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3120 assert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3121
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3122 if (v->offset < offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3123 { e = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3124 sd->hasUnions = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3125 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3126 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3127 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3128 if (v->init)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3129 { e = v->init->toExpression();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3130 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3131 error("cannot make expression out of initializer for %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3132 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3133 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3134 { e = v->type->defaultInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3135 e->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3137 offset = v->offset + v->type->size();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3138 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3139 elements->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3140 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3141
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3142 type = sd->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3143 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3144 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3145
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3146 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3147 * Gets expression at offset of type.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3148 * Returns NULL if not found.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3149 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3150
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3151 Expression *StructLiteralExp::getField(Type *type, unsigned offset)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3152 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3153 //printf("StructLiteralExp::getField(this = %s, type = %s, offset = %u)\n",
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3154 // /*toChars()*/"", type->toChars(), offset);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3155 Expression *e = NULL;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3156 int i = getFieldIndex(type, offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3157
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3158 if (i != -1)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3159 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3160 //printf("\ti = %d\n", i);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3161 assert(i < elements->dim);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3162 e = (Expression *)elements->data[i];
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3163 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3164 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3165 e = e->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3166 e->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3167 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3168 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3169 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3170 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3171
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3172 /************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3173 * Get index of field.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3174 * Returns -1 if not found.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3175 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3176
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3177 int StructLiteralExp::getFieldIndex(Type *type, unsigned offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3178 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3179 /* Find which field offset is by looking at the field offsets
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3180 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3181 for (size_t i = 0; i < sd->fields.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3182 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3183 Dsymbol *s = (Dsymbol *)sd->fields.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3184 VarDeclaration *v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3185 assert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3186
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3187 if (offset == v->offset &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3188 type->size() == v->type->size())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3189 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3190 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3191 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3192 return i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3193 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3194 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3195 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3196 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3197 return -1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3198 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3199
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3200 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3201 int StructLiteralExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3202 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3203 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3204 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3205 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3206
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3207 Expression *StructLiteralExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3208 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3209 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3210 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3211
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3212
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3213 int StructLiteralExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3214 { int f = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3216 for (size_t i = 0; i < elements->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3217 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3218 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3219 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3221 f |= e->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3222 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3223 if (flag == 0 && f == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3224 Expression::checkSideEffect(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3225 return f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3226 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3227
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3228 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3229 int StructLiteralExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3230 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3231 return arrayExpressionCanThrow(elements);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3232 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3233 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3234
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3235 void StructLiteralExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3236 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3237 buf->writestring(sd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3238 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3239 argsToCBuffer(buf, elements, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3240 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3241 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3242
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3243 void StructLiteralExp::toMangleBuffer(OutBuffer *buf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3244 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3245 size_t dim = elements ? elements->dim : 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3246 buf->printf("S%u", dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3247 for (size_t i = 0; i < dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3248 { Expression *e = (Expression *)elements->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3249 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3250 e->toMangleBuffer(buf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3251 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3252 buf->writeByte('v'); // 'v' for void
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3253 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3255
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3256 /************************ TypeDotIdExp ************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3257
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3258 /* Things like:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3259 * int.size
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3260 * foo.size
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3261 * (foo).size
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3262 * cast(foo).size
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3263 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3265 TypeDotIdExp::TypeDotIdExp(Loc loc, Type *type, Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3266 : Expression(loc, TOKtypedot, sizeof(TypeDotIdExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3267 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3268 this->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3269 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3270 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3271
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3272 Expression *TypeDotIdExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3273 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3274 TypeDotIdExp *te = new TypeDotIdExp(loc, type->syntaxCopy(), ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3275 return te;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3276 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3277
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3278 Expression *TypeDotIdExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3279 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3280
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3281 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3282 printf("TypeDotIdExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3283 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3284 e = new DotIdExp(loc, new TypeExp(loc, type), ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3285 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3286 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3287 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3288
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3289 void TypeDotIdExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3290 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3291 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3292 type->toCBuffer(buf, NULL, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3293 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3294 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3295 buf->writestring(ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3296 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3297
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3298 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3299
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3300 // Mainly just a placeholder
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3301
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3302 TypeExp::TypeExp(Loc loc, Type *type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3303 : Expression(loc, TOKtype, sizeof(TypeExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3304 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3305 //printf("TypeExp::TypeExp(%s)\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3306 this->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3307 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3308
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3309 Expression *TypeExp::syntaxCopy()
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3310 {
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3311 //printf("TypeExp::syntaxCopy()\n");
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3312 return new TypeExp(loc, type->syntaxCopy());
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3313 }
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
3314
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3315 Expression *TypeExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3316 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3317 //printf("TypeExp::semantic(%s)\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3318 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3319 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3321
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3322 void TypeExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3323 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3324 type->toCBuffer(buf, NULL, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3325 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3326
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3327 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3328
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3329 // Mainly just a placeholder
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3330
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3331 ScopeExp::ScopeExp(Loc loc, ScopeDsymbol *pkg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3332 : Expression(loc, TOKimport, sizeof(ScopeExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3333 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3334 //printf("ScopeExp::ScopeExp(pkg = '%s')\n", pkg->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3335 //static int count; if (++count == 38) *(char*)0=0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3336 this->sds = pkg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3337 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3338
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3339 Expression *ScopeExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3340 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3341 ScopeExp *se = new ScopeExp(loc, (ScopeDsymbol *)sds->syntaxCopy(NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3342 return se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3343 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3344
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3345 Expression *ScopeExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3346 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3347 TemplateInstance *ti;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3348 ScopeDsymbol *sds2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3350 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3351 printf("+ScopeExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3352 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3353 Lagain:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3354 ti = sds->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3355 if (ti && !global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3356 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3357 if (!ti->semanticdone)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3358 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3359 s = ti->inst->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3360 sds2 = s->isScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3361 if (!sds2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3362 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3363
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3364 //printf("s = %s, '%s'\n", s->kind(), s->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3365 if (ti->withsym)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3366 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3367 // Same as wthis.s
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3368 e = new VarExp(loc, ti->withsym->withstate->wthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3369 e = new DotVarExp(loc, e, s->isDeclaration());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3370 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3371 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3372 e = new DsymbolExp(loc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3373 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3374 //printf("-1ScopeExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3375 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3376 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3377 if (sds2 != sds)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3378 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3379 sds = sds2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3380 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3382 //printf("sds = %s, '%s'\n", sds->kind(), sds->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3383 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3384 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3385 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3386 //printf("sds = %s, '%s'\n", sds->kind(), sds->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3387 //printf("\tparent = '%s'\n", sds->parent->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3388 sds->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3389 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3390 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3391 //printf("-2ScopeExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3392 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3393 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3394
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3395 void ScopeExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3396 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3397 if (sds->isTemplateInstance())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3398 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3399 sds->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3400 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3401 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3402 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3403 buf->writestring(sds->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3404 buf->writestring(" ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3405 buf->writestring(sds->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3406 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3408
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3409 /********************** TemplateExp **************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3410
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3411 // Mainly just a placeholder
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3412
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3413 TemplateExp::TemplateExp(Loc loc, TemplateDeclaration *td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3414 : Expression(loc, TOKtemplate, sizeof(TemplateExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3415 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3416 //printf("TemplateExp(): %s\n", td->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3417 this->td = td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3418 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3419
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3420 void TemplateExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3421 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3422 buf->writestring(td->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3423 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3424
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3425 void TemplateExp::rvalue()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3426 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3427 error("template %s has no value", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3428 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3429
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3430 /********************** NewExp **************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3431
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3432 /* thisexp.new(newargs) newtype(arguments) */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3433
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3434 NewExp::NewExp(Loc loc, Expression *thisexp, Expressions *newargs,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3435 Type *newtype, Expressions *arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3436 : Expression(loc, TOKnew, sizeof(NewExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3438 this->thisexp = thisexp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3439 this->newargs = newargs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3440 this->newtype = newtype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3441 this->arguments = arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3442 member = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3443 allocator = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3444 onstack = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3445 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3446
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3447 Expression *NewExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3448 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3449 return new NewExp(loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3450 thisexp ? thisexp->syntaxCopy() : NULL,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3451 arraySyntaxCopy(newargs),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3452 newtype->syntaxCopy(), arraySyntaxCopy(arguments));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3453 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3454
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3455
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3456 Expression *NewExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3457 { int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3458 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3459 ClassDeclaration *cdthis = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3460
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3461 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3462 printf("NewExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3463 if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3464 printf("\tthisexp = %s\n", thisexp->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3465 printf("\tnewtype: %s\n", newtype->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3466 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3467 if (type) // if semantic() already run
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3468 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3469
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3470 Lagain:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3471 if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3472 { thisexp = thisexp->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3473 cdthis = thisexp->type->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3474 if (cdthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3475 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3476 sc = sc->push(cdthis);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3477 type = newtype->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3478 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3479 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3480 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3482 error("'this' for nested class must be a class type, not %s", thisexp->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3483 type = newtype->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3484 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3485 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3486 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3487 type = newtype->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3488 newtype = type; // in case type gets cast to something else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3489 tb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3490 //printf("tb: %s, deco = %s\n", tb->toChars(), tb->deco);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3491
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3492 arrayExpressionSemantic(newargs, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3493 preFunctionArguments(loc, sc, newargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3494 arrayExpressionSemantic(arguments, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3495 preFunctionArguments(loc, sc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3496
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3497 if (thisexp && tb->ty != Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3498 error("e.new is only for allocating nested classes, not %s", tb->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3499
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3500 if (tb->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3501 { TypeFunction *tf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3503 TypeClass *tc = (TypeClass *)(tb);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3504 ClassDeclaration *cd = tc->sym->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3505 if (cd->isInterfaceDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3506 error("cannot create instance of interface %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3507 else if (cd->isAbstract())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3508 { error("cannot create instance of abstract class %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3509 for (int i = 0; i < cd->vtbl.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3510 { FuncDeclaration *fd = ((Dsymbol *)cd->vtbl.data[i])->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3511 if (fd && fd->isAbstract())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3512 error("function %s is abstract", fd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3513 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3514 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3515 checkDeprecated(sc, cd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3516 if (cd->isNested())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3517 { /* We need a 'this' pointer for the nested class.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3518 * Ensure we have the right one.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3519 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3520 Dsymbol *s = cd->toParent2();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3521 ClassDeclaration *cdn = s->isClassDeclaration();
639
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3522 FuncDeclaration *fdn = s->isFuncDeclaration();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3523
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3524 //printf("cd isNested, cdn = %s\n", cdn ? cdn->toChars() : "null");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3525 if (cdn)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3527 if (!cdthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3528 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3529 // Supply an implicit 'this' and try again
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3530 thisexp = new ThisExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3531 for (Dsymbol *sp = sc->parent; 1; sp = sp->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3532 { if (!sp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3533 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3534 error("outer class %s 'this' needed to 'new' nested class %s", cdn->toChars(), cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3535 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3536 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3537 ClassDeclaration *cdp = sp->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3538 if (!cdp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3539 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3540 if (cdp == cdn || cdn->isBaseOf(cdp, NULL))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3541 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3542 // Add a '.outer' and try again
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3543 thisexp = new DotIdExp(loc, thisexp, Id::outer);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3544 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3545 if (!global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3546 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3547 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3548 if (cdthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3549 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3550 //printf("cdthis = %s\n", cdthis->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3551 if (cdthis != cdn && !cdn->isBaseOf(cdthis, NULL))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3552 error("'this' for nested class must be of type %s, not %s", cdn->toChars(), thisexp->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3553 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3554 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3555 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3556 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3557 for (Dsymbol *sf = sc->func; 1; sf= sf->toParent2()->isFuncDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3558 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3559 if (!sf)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3560 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3561 error("outer class %s 'this' needed to 'new' nested class %s", cdn->toChars(), cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3562 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3563 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3564 printf("sf = %s\n", sf->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3565 AggregateDeclaration *ad = sf->isThis();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3566 if (ad && (ad == cdn || cdn->isBaseOf(ad->isClassDeclaration(), NULL)))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3567 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3568 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3569 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3570 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3571 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3572 else if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3573 error("e.new is only for allocating nested classes");
639
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3574 else if (fdn)
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3575 {
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3576 // make sure the parent context fdn of cd is reachable from sc
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3577 for (Dsymbol *sp = sc->parent; 1; sp = sp->parent)
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3578 {
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3579 if (fdn == sp)
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3580 break;
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3581 FuncDeclaration *fsp = sp ? sp->isFuncDeclaration() : NULL;
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3582 if (!sp || (fsp && fsp->isStatic()))
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3583 {
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3584 error("outer function context of %s is needed to 'new' nested class %s", fdn->toPrettyChars(), cd->toPrettyChars());
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3585 break;
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3586 }
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3587 }
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3588
8aebdf56c455 Move check for access of context for nested class from backend into frontend.
Christian Kamm <kamm incasoftware de>
parents: 599
diff changeset
3589 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3590 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3591 else if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3592 error("e.new is only for allocating nested classes");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3593
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3594 FuncDeclaration *f = cd->ctor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3595 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3596 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3597 assert(f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3598 f = f->overloadResolve(loc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3599 checkDeprecated(sc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3600 member = f->isCtorDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3601 assert(member);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3603 cd->accessCheck(loc, sc, member);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3604
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3605 tf = (TypeFunction *)f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3606 type = tf->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3607
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3608 if (!arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3609 arguments = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3610 functionArguments(loc, sc, tf, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3611 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3612 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3613 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3614 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3615 error("no constructor for %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3616 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3617
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3618 if (cd->aggNew)
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3619 {
891
ea82e2077f9d Change custom allocator new size argument to size_t instead of uint. See #175.
Christian Kamm <kamm incasoftware de>
parents: 876
diff changeset
3620 // Prepend the size_t size argument to newargs[]
ea82e2077f9d Change custom allocator new size argument to size_t instead of uint. See #175.
Christian Kamm <kamm incasoftware de>
parents: 876
diff changeset
3621 Expression *e = new IntegerExp(loc, cd->size(loc), Type::tsize_t);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3622 if (!newargs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3623 newargs = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3624 newargs->shift(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3625
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3626 f = cd->aggNew->overloadResolve(loc, newargs);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3627 allocator = f->isNewDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3628 assert(allocator);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3629
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3630 tf = (TypeFunction *)f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3631 functionArguments(loc, sc, tf, newargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3632 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3633 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3634 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3635 if (newargs && newargs->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3636 error("no allocator for %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3637 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3638 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3639 else if (tb->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3640 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3641 TypeStruct *ts = (TypeStruct *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3642 StructDeclaration *sd = ts->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3643 FuncDeclaration *f = sd->aggNew;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3644 TypeFunction *tf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3645
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3646 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3647 error("no constructor for %s", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3648
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3649 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3650 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3651 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3652
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3653 // Prepend the uint size argument to newargs[]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3654 e = new IntegerExp(loc, sd->size(loc), Type::tuns32);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3655 if (!newargs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3656 newargs = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3657 newargs->shift(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3658
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3659 f = f->overloadResolve(loc, newargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3660 allocator = f->isNewDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3661 assert(allocator);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3662
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3663 tf = (TypeFunction *)f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3664 functionArguments(loc, sc, tf, newargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3665
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3666 e = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3667 e = new CallExp(loc, e, newargs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3668 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3669 e->type = type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3670 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3671 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3672
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3673 type = type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3674 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3675 else if (tb->ty == Tarray && (arguments && arguments->dim))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3676 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3677 for (size_t i = 0; i < arguments->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3678 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3679 if (tb->ty != Tarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3680 { error("too many arguments for array");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3681 arguments->dim = i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3682 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3683 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3684
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3685 Expression *arg = (Expression *)arguments->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3686 arg = resolveProperties(sc, arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3687 arg = arg->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3688 if (arg->op == TOKint64 && (long long)arg->toInteger() < 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3689 error("negative array index %s", arg->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3690 arguments->data[i] = (void *) arg;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
3691 tb = ((TypeDArray *)tb)->next->toBasetype();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3692 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3693 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3694 else if (tb->isscalar())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3695 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3696 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3697 error("no constructor for %s", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3698
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3699 type = type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3700 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3701 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3702 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3703 error("new can only create structs, dynamic arrays or class objects, not %s's", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3704 type = type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3705 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3706
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3707 //printf("NewExp: '%s'\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3708 //printf("NewExp:type '%s'\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3709
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3710 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3711 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3712
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3713 int NewExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3714 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3715 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3716 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3717
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3718 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3719 int NewExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3720 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3721 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3722 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3723 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3724
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3725 void NewExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3726 { int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3727
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3728 if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3729 { expToCBuffer(buf, hgs, thisexp, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3730 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3731 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3732 buf->writestring("new ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3733 if (newargs && newargs->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3734 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3735 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3736 argsToCBuffer(buf, newargs, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3737 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3738 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3739 newtype->toCBuffer(buf, NULL, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3740 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3741 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3742 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3743 argsToCBuffer(buf, arguments, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3744 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3745 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3746 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3747
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3748 /********************** NewAnonClassExp **************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3749
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3750 NewAnonClassExp::NewAnonClassExp(Loc loc, Expression *thisexp,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3751 Expressions *newargs, ClassDeclaration *cd, Expressions *arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3752 : Expression(loc, TOKnewanonclass, sizeof(NewAnonClassExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3753 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3754 this->thisexp = thisexp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3755 this->newargs = newargs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3756 this->cd = cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3757 this->arguments = arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3758 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3759
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3760 Expression *NewAnonClassExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3761 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3762 return new NewAnonClassExp(loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3763 thisexp ? thisexp->syntaxCopy() : NULL,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3764 arraySyntaxCopy(newargs),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3765 (ClassDeclaration *)cd->syntaxCopy(NULL),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3766 arraySyntaxCopy(arguments));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3767 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3768
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3769
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3770 Expression *NewAnonClassExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3771 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3772 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3773 printf("NewAnonClassExp::semantic() %s\n", toChars());
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
3774 //printf("thisexp = %p\n", thisexp);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3775 //printf("type: %s\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3776 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3777
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3778 Expression *d = new DeclarationExp(loc, cd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3779 d = d->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3780
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3781 Expression *n = new NewExp(loc, thisexp, newargs, cd->type, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3782
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3783 Expression *c = new CommaExp(loc, d, n);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3784 return c->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3785 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3786
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3787 int NewAnonClassExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3788 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3789 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3790 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3791
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3792 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3793 int NewAnonClassExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3794 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3795 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3796 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3797 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3798
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3799 void NewAnonClassExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3800 { int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3801
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3802 if (thisexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3803 { expToCBuffer(buf, hgs, thisexp, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3804 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3805 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3806 buf->writestring("new");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3807 if (newargs && newargs->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3808 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3809 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3810 argsToCBuffer(buf, newargs, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3811 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3812 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3813 buf->writestring(" class ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3814 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3815 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3816 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3817 argsToCBuffer(buf, arguments, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3818 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3819 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3820 //buf->writestring(" { }");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3821 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3822 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3823 cd->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3824 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3825 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3826
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3827 /********************** SymbolExp **************************************/
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3828
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3829 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3830 SymbolExp::SymbolExp(Loc loc, enum TOK op, int size, Declaration *var, int hasOverloads)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3831 : Expression(loc, op, size)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3832 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3833 assert(var);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3834 this->var = var;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3835 this->hasOverloads = hasOverloads;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3836 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3837 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3838
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3839 /********************** SymOffExp **************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3840
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3841 SymOffExp::SymOffExp(Loc loc, Declaration *var, unsigned offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3842 : Expression(loc, TOKsymoff, sizeof(SymOffExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3843 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3844 assert(var);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3845 this->var = var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3846 this->offset = offset;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3847 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3848 if (v && v->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3849 error("need 'this' for address of %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3850 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3851
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3852 Expression *SymOffExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3853 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3854 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3855 printf("SymOffExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3856 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3857 //var->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3858 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3859 type = var->type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3860 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3861 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3862 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3863 v->checkNestedReference(sc, loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3864 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3865 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3866 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3867
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3868 int SymOffExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3869 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3870 return result ? TRUE : FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3871 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3872
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3873 void SymOffExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3874 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3875 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3876 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3877 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3878 if (!v->isDataseg())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3879 error("escaping reference to local variable %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3880 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3881 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3882
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3883 void SymOffExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3884 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3885 if (offset)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3886 buf->printf("(& %s+%u)", var->toChars(), offset);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3887 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3888 buf->printf("& %s", var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3889 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3890
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3891 /******************************** VarExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3892
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3893 VarExp::VarExp(Loc loc, Declaration *var)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3894 : Expression(loc, TOKvar, sizeof(VarExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3895 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3896 //printf("VarExp(this = %p, '%s')\n", this, var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3897 this->var = var;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3898 this->type = var->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3899 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3900
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3901 int VarExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3902 { VarExp *ne;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3903
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3904 if (this == o ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3905 (((Expression *)o)->op == TOKvar &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3906 ((ne = (VarExp *)o), type->equals(ne->type)) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3907 var == ne->var))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3908 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3909 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3910 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3911
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3912 Expression *VarExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3913 { FuncLiteralDeclaration *fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3914
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3915 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3916 printf("VarExp::semantic(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3917 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3918 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3919 { type = var->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3920 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3921 if (var->storage_class & STClazy)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3922 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3923 TypeFunction *tf = new TypeFunction(NULL, type, 0, LINKd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3924 type = new TypeDelegate(tf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3925 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3926 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3927 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3928 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3929 /* Fix for 1161 doesn't work because it causes protection
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3930 * problems when instantiating imported templates passing private
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3931 * variables as alias template parameters.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3932 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3933 //accessCheck(loc, sc, NULL, var);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3934
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3935 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3936 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3937 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3938 if (v->isConst() && type->toBasetype()->ty != Tsarray && v->init)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3939 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3940 ExpInitializer *ei = v->init->isExpInitializer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3941 if (ei)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3942 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3943 //ei->exp->implicitCastTo(sc, type)->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3944 return ei->exp->implicitCastTo(sc, type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3945 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3946 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3947 v->checkNestedReference(sc, loc);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3948 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3949 if (sc->func && sc->func->isPure() && !sc->intypeof)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3950 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3951 if (v->isDataseg() && !v->isInvariant())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3952 error("pure function '%s' cannot access mutable static data '%s'", sc->func->toChars(), v->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3953 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3954 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3955 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3956 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3957 else if ((fd = var->isFuncLiteralDeclaration()) != NULL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3958 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3959 e = new FuncExp(loc, fd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3960 e->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3961 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3962 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3963 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3964 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3965 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3966
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3967 char *VarExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3968 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3969 return var->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3970 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3971
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3972 void VarExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3973 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3974 buf->writestring(var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3975 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3976
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3977 void VarExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3978 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3979 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3980 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3981 { Type *tb = v->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3982 // if reference type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3983 if (tb->ty == Tarray || tb->ty == Tsarray || tb->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3984 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3985 if ((v->isAuto() || v->isScope()) && !v->noauto)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3986 error("escaping reference to auto local %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3987 else if (v->storage_class & STCvariadic)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3988 error("escaping reference to variadic parameter %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3989 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3990 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3991 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
3992
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3993 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3994 int VarExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3995 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3996 if (var->storage_class & STClazy)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3997 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3998 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
3999 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4000 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4001
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4002 Expression *VarExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4003 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4004 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4005 tym = tybasic(e1->ET->Tty);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4006 if (!(tyscalar(tym) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4007 tym == TYstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4008 tym == TYarray && e->Eoper == TOKaddr))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4009 synerr(EM_lvalue); // lvalue expected
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4010 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4011 if (var->storage_class & STClazy)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4012 error("lazy variables cannot be lvalues");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4013 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4014 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4015
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4016 Expression *VarExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4017 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4018 //printf("VarExp::modifiableLvalue('%s')\n", var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4019 if (sc->incontract && var->isParameter())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4020 error("cannot modify parameter '%s' in contract", var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4021
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4022 if (type && type->toBasetype()->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4023 error("cannot change reference to static array '%s'", var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4024
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4025 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4026 if (v && v->canassign == 0 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4027 (var->isConst() || (global.params.Dversion > 1 && var->isFinal())))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4028 error("cannot modify final variable '%s'", var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4029
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4030 if (var->isCtorinit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4031 { // It's only modifiable if inside the right constructor
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4032 Dsymbol *s = sc->func;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4033 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4034 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4035 FuncDeclaration *fd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4036 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4037 fd = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4038 if (fd &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4039 ((fd->isCtorDeclaration() && var->storage_class & STCfield) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4040 (fd->isStaticCtorDeclaration() && !(var->storage_class & STCfield))) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4041 fd->toParent() == var->toParent()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4042 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4043 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4044 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4045 assert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4046 v->ctorinit = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4047 //printf("setting ctorinit\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4049 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4050 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4051 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4052 { s = s->toParent2();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4053 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4054 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4055 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4056 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4057 const char *p = var->isStatic() ? "static " : "";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4058 error("can only initialize %sconst %s inside %sconstructor",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4059 p, var->toChars(), p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4060 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4061 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4062 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4063 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4064 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4065
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4066 // See if this expression is a modifiable lvalue (i.e. not const)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4067 return toLvalue(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4068 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4069
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4070
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4071 /******************************** OverExp **************************/
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4072
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4073 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4074 OverExp::OverExp(OverloadSet *s)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4075 : Expression(loc, TOKoverloadset, sizeof(OverExp))
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4076 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4077 //printf("OverExp(this = %p, '%s')\n", this, var->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4078 vars = s;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4079 type = Type::tvoid;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4080 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4081
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4082 int OverExp::isLvalue()
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4083 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4084 return 1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4085 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4086
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4087 Expression *OverExp::toLvalue(Scope *sc, Expression *e)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4088 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4089 return this;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4090 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4091 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4092
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4093
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4094 /******************************** TupleExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4095
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4096 TupleExp::TupleExp(Loc loc, Expressions *exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4097 : Expression(loc, TOKtuple, sizeof(TupleExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4098 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4099 //printf("TupleExp(this = %p)\n", this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4100 this->exps = exps;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4101 this->type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4102 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4104
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4105 TupleExp::TupleExp(Loc loc, TupleDeclaration *tup)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4106 : Expression(loc, TOKtuple, sizeof(TupleExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4107 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4108 exps = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4109 type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4111 exps->reserve(tup->objects->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4112 for (size_t i = 0; i < tup->objects->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4113 { Object *o = (Object *)tup->objects->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4114 if (o->dyncast() == DYNCAST_EXPRESSION)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4115 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4116 Expression *e = (Expression *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4117 e = e->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4118 exps->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4119 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4120 else if (o->dyncast() == DYNCAST_DSYMBOL)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4121 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4122 Dsymbol *s = (Dsymbol *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4123 Expression *e = new DsymbolExp(loc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4124 exps->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4125 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4126 else if (o->dyncast() == DYNCAST_TYPE)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4127 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4128 Type *t = (Type *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4129 Expression *e = new TypeExp(loc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4130 exps->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4131 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4132 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4133 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4134 error("%s is not an expression", o->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4135 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4137 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4138
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4139 int TupleExp::equals(Object *o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4140 { TupleExp *ne;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4141
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4142 if (this == o)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4143 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4144 if (((Expression *)o)->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4145 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4146 TupleExp *te = (TupleExp *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4147 if (exps->dim != te->exps->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4148 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4149 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4150 { Expression *e1 = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4151 Expression *e2 = (Expression *)te->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4152
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4153 if (!e1->equals(e2))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4154 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4155 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4156 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4157 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4158 return 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4159 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4160
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4161 Expression *TupleExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4162 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4163 return new TupleExp(loc, arraySyntaxCopy(exps));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4164 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4165
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4166 Expression *TupleExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4167 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4168 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4169 printf("+TupleExp::semantic(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4170 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4171 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4172 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4173
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4174 // Run semantic() on each argument
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4175 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4176 { Expression *e = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4177
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4178 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4179 if (!e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4180 { error("%s has no value", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4181 e->type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4182 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4183 exps->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4184 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4186 expandTuples(exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4187 if (0 && exps->dim == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4188 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4189 return (Expression *)exps->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4190 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4191 type = new TypeTuple(exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4192 //printf("-TupleExp::semantic(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4193 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4194 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4195
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4196 void TupleExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4197 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4198 buf->writestring("tuple(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4199 argsToCBuffer(buf, exps, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4200 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4201 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4202
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4203 int TupleExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4204 { int f = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4205
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4206 for (int i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4207 { Expression *e = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4209 f |= e->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4210 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4211 if (flag == 0 && f == 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4212 Expression::checkSideEffect(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4213 return f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4214 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4215
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4216 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4217 int TupleExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4218 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4219 return arrayExpressionCanThrow(exps);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4220 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4221 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4222
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4223 void TupleExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4224 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4225 for (size_t i = 0; i < exps->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4226 { Expression *e = (Expression *)exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4227 e->checkEscape();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4228 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4229 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4230
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4231 /******************************** FuncExp *********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4232
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4233 FuncExp::FuncExp(Loc loc, FuncLiteralDeclaration *fd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4234 : Expression(loc, TOKfunction, sizeof(FuncExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4235 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4236 this->fd = fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4237 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4239 Expression *FuncExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4240 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4241 return new FuncExp(loc, (FuncLiteralDeclaration *)fd->syntaxCopy(NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4242 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4243
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4244 Expression *FuncExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4245 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4246 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4247 printf("FuncExp::semantic(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4248 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4249 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4250 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4251 fd->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4252 fd->parent = sc->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4253 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4254 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4255 if (!fd->type->next)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4256 fd->type->next = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4257 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4258 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4259 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4260 fd->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4261 if (!global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4262 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4263 fd->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4264
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4265 if (!global.errors && global.params.useInline)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4266 fd->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4268 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4269
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4270 // Type is a "delegate to" or "pointer to" the function literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4271 if (fd->isNested())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4272 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4273 type = new TypeDelegate(fd->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4274 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4275 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4276 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4277 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4278 type = fd->type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4279 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4281 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4282 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4283
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4284 char *FuncExp::toChars()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4285 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4286 return fd->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4287 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4288
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4289 void FuncExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4290 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4291 buf->writestring(fd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4292 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4293
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4294
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4295 /******************************** DeclarationExp **************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4296
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4297 DeclarationExp::DeclarationExp(Loc loc, Dsymbol *declaration)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4298 : Expression(loc, TOKdeclaration, sizeof(DeclarationExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4299 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4300 this->declaration = declaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4303 Expression *DeclarationExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4304 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4305 return new DeclarationExp(loc, declaration->syntaxCopy(NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4306 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4307
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4308 Expression *DeclarationExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4309 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4310 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4311 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4312
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4313 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4314 printf("DeclarationExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4315 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4317 /* This is here to support extern(linkage) declaration,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4318 * where the extern(linkage) winds up being an AttribDeclaration
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4319 * wrapper.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4320 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4321 Dsymbol *s = declaration;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4322
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4323 AttribDeclaration *ad = declaration->isAttribDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4324 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4325 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4326 if (ad->decl && ad->decl->dim == 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4327 s = (Dsymbol *)ad->decl->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4328 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4329
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4330 if (s->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4331 { // Do semantic() on initializer first, so:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4332 // int a = a;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4333 // will be illegal.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4334 declaration->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4335 s->parent = sc->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4337
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4338 //printf("inserting '%s' %p into sc = %p\n", s->toChars(), s, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4339 // Insert into both local scope and function scope.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4340 // Must be unique in both.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4341 if (s->ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4342 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4343 if (!sc->insert(s))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4344 error("declaration %s is already defined", s->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4345 else if (sc->func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4346 { VarDeclaration *v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4347 if ((s->isFuncDeclaration() /*|| v && v->storage_class & STCstatic*/) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4348 !sc->func->localsymtab->insert(s))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4349 error("declaration %s is already defined in another scope in %s", s->toPrettyChars(), sc->func->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4350 else if (!global.params.useDeprecated)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4351 { // Disallow shadowing
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4352
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4353 for (Scope *scx = sc->enclosing; scx && scx->func == sc->func; scx = scx->enclosing)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4354 { Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4355
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4356 if (scx->scopesym && scx->scopesym->symtab &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4357 (s2 = scx->scopesym->symtab->lookup(s->ident)) != NULL &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4358 s != s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4359 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4360 error("shadowing declaration %s is deprecated", s->toPrettyChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4362 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4364 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4366 if (!s->isVarDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4367 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4368 declaration->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4369 s->parent = sc->parent;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4370 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4371 if (!global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4372 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4373 declaration->semantic2(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4374 if (!global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4376 declaration->semantic3(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4377
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4378 if (!global.errors && global.params.useInline)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4379 declaration->inlineScan();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4380 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4381 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4382
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4383 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4384 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4385 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4386
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4387 int DeclarationExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4388 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4389 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4390 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4391
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4392 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4393 int DeclarationExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4394 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4395 VarDeclaration *v = declaration->isVarDeclaration();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4396 if (v && v->init)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4397 { ExpInitializer *ie = v->init->isExpInitializer();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4398 return ie && ie->exp->canThrow();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4399 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4400 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4401 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4402 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4403
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4404 void DeclarationExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4405 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4406 declaration->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4408
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4409
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4410 /************************ TypeidExp ************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4411
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4412 /*
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4413 * typeid(int)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4414 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4415
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4416 TypeidExp::TypeidExp(Loc loc, Type *typeidType)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4417 : Expression(loc, TOKtypeid, sizeof(TypeidExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4418 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4419 this->typeidType = typeidType;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4420 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4421
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4423 Expression *TypeidExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4424 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4425 return new TypeidExp(loc, typeidType->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4426 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4427
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4429 Expression *TypeidExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4430 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4431
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4432 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4433 printf("TypeidExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4434 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4435 typeidType = typeidType->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4436 e = typeidType->getTypeInfo(sc);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
4437 if (e->loc.linnum == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
4438 e->loc = loc; // so there's at least some line number info
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4439 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4440 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4441
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4442 void TypeidExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4443 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4444 buf->writestring("typeid(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4445 typeidType->toCBuffer(buf, NULL, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4446 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4447 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4448
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4449 /************************ TraitsExp ************************************/
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4450 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4451 /*
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4452 * __traits(identifier, args...)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4453 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4454
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4455 TraitsExp::TraitsExp(Loc loc, Identifier *ident, Objects *args)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4456 : Expression(loc, TOKtraits, sizeof(TraitsExp))
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4457 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4458 this->ident = ident;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4459 this->args = args;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4460 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4461
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4462
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4463 Expression *TraitsExp::syntaxCopy()
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4464 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4465 return new TraitsExp(loc, ident, TemplateInstance::arraySyntaxCopy(args));
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4466 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4467
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4468
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4469 void TraitsExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4470 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4471 buf->writestring("__traits(");
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4472 buf->writestring(ident->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4473 if (args)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4474 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4475 for (int i = 0; i < args->dim; i++)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4476 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4477 buf->writeByte(',');
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4478 Object *oarg = (Object *)args->data[i];
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4479 ObjectToCBuffer(buf, hgs, oarg);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4480 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4481 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4482 buf->writeByte(')');
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4483 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4484 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4485
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4486 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4487
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4488 HaltExp::HaltExp(Loc loc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4489 : Expression(loc, TOKhalt, sizeof(HaltExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4490 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4491 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4492
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4493 Expression *HaltExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4494 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4495 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4496 printf("HaltExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4497 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4498 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4499 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4500 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4501
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4502 int HaltExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4503 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4504 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4505 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4506
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4507 void HaltExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4508 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4509 buf->writestring("halt");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4510 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4511
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4512 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4513
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4514 IsExp::IsExp(Loc loc, Type *targ, Identifier *id, enum TOK tok,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4515 Type *tspec, enum TOK tok2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4516 : Expression(loc, TOKis, sizeof(IsExp))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4517 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4518 this->targ = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4519 this->id = id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4520 this->tok = tok;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4521 this->tspec = tspec;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4522 this->tok2 = tok2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4523 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4524
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4525 Expression *IsExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4526 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4527 return new IsExp(loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4528 targ->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4529 id,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4530 tok,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4531 tspec ? tspec->syntaxCopy() : NULL,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4532 tok2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4533 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4534
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4535 Expression *IsExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4536 { Type *tded;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4537
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4538 /* is(targ id tok tspec)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4539 * is(targ id == tok2)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4540 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4541
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4542 //printf("IsExp::semantic(%s)\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4543 if (id && !(sc->flags & SCOPEstaticif))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4544 error("can only declare type aliases within static if conditionals");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4545
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4546 unsigned errors_save = global.errors;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4547 global.errors = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4548 global.gag++; // suppress printing of error messages
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4549 targ = targ->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4550 global.gag--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4551 unsigned gerrors = global.errors;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4552 global.errors = errors_save;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4553
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4554 if (gerrors) // if any errors happened
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4555 { // then condition is false
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4556 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4557 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4558 else if (tok2 != TOKreserved)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4559 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4560 switch (tok2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4561 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4562 case TOKtypedef:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4563 if (targ->ty != Ttypedef)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4564 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4565 tded = ((TypeTypedef *)targ)->sym->basetype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4566 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4567
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4568 case TOKstruct:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4569 if (targ->ty != Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4570 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4571 if (((TypeStruct *)targ)->sym->isUnionDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4572 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4573 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4574 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4575
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4576 case TOKunion:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4577 if (targ->ty != Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4578 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4579 if (!((TypeStruct *)targ)->sym->isUnionDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4580 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4581 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4582 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4583
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4584 case TOKclass:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4585 if (targ->ty != Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4586 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4587 if (((TypeClass *)targ)->sym->isInterfaceDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4588 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4589 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4590 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4591
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4592 case TOKinterface:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4593 if (targ->ty != Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4594 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4595 if (!((TypeClass *)targ)->sym->isInterfaceDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4596 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4597 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4598 break;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4599 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4600 case TOKconst:
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4601 if (!targ->isConst())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4602 goto Lno;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4603 tded = targ;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4604 break;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4605
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4606 case TOKinvariant:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4607 case TOKimmutable:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4608 if (!targ->isInvariant())
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4609 goto Lno;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4610 tded = targ;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4611 break;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4612 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4613
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4614 case TOKsuper:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4615 // If class or interface, get the base class and interfaces
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4616 if (targ->ty != Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4617 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4618 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4619 { ClassDeclaration *cd = ((TypeClass *)targ)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4620 Arguments *args = new Arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4621 args->reserve(cd->baseclasses.dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4622 for (size_t i = 0; i < cd->baseclasses.dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4623 { BaseClass *b = (BaseClass *)cd->baseclasses.data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4624 args->push(new Argument(STCin, b->type, NULL, NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4625 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4626 tded = new TypeTuple(args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4627 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4628 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4629
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4630 case TOKenum:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4631 if (targ->ty != Tenum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4632 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4633 tded = ((TypeEnum *)targ)->sym->memtype;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4634 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4635
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4636 case TOKdelegate:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4637 if (targ->ty != Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4638 goto Lno;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4639 tded = ((TypeDelegate *)targ)->next; // the underlying function type
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4640 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4641
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4642 case TOKfunction:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4643 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4644 if (targ->ty != Tfunction)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4645 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4646 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4647
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4648 /* Generate tuple from function parameter types.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4649 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4650 assert(tded->ty == Tfunction);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4651 Arguments *params = ((TypeFunction *)tded)->parameters;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4652 size_t dim = Argument::dim(params);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4653 Arguments *args = new Arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4654 args->reserve(dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4655 for (size_t i = 0; i < dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4656 { Argument *arg = Argument::getNth(params, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4657 assert(arg && arg->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4658 args->push(new Argument(arg->storageClass, arg->type, NULL, NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4659 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4660 tded = new TypeTuple(args);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4661 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4662 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4663 case TOKreturn:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4664 /* Get the 'return type' for the function,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4665 * delegate, or pointer to function.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4666 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4667 if (targ->ty == Tfunction)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4668 tded = ((TypeFunction *)targ)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4669 else if (targ->ty == Tdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4670 tded = targ->next->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4671 else if (targ->ty == Tpointer && targ->next->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4672 tded = targ->next->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4673 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4674 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4675 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4676
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4677 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4678 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4679 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4680 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4681 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4682 else if (id && tspec)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4683 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4684 /* Evaluate to TRUE if targ matches tspec.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4685 * If TRUE, declare id as an alias for the specialized type.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4686 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4687
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4688 MATCH m;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4689 TemplateTypeParameter tp(loc, id, NULL, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4690
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4691 TemplateParameters parameters;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4692 parameters.setDim(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4693 parameters.data[0] = (void *)&tp;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4694
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4695 Objects dedtypes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4696 dedtypes.setDim(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4697 dedtypes.data[0] = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4698
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4699 m = targ->deduceType(NULL, tspec, &parameters, &dedtypes);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4700 if (m == MATCHnomatch ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4701 (m != MATCHexact && tok == TOKequal))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4702 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4703 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4704 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4705 assert(dedtypes.dim == 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4706 tded = (Type *)dedtypes.data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4707 if (!tded)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4708 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4709 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4710 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4711 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4712 else if (id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4713 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4714 /* Declare id as an alias for type targ. Evaluate to TRUE
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4715 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4716 tded = targ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4717 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4718 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4719 else if (tspec)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4720 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4721 /* Evaluate to TRUE if targ matches tspec
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4722 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4723 tspec = tspec->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4724 //printf("targ = %s\n", targ->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4725 //printf("tspec = %s\n", tspec->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4726 if (tok == TOKcolon)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4727 { if (targ->implicitConvTo(tspec))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4728 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4729 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4730 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4731 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4732 else /* == */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4733 { if (targ->equals(tspec))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4734 goto Lyes;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4735 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4736 goto Lno;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4737 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4738 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4739
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4740 Lyes:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4741 if (id)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4742 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4743 Dsymbol *s = new AliasDeclaration(loc, id, tded);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4744 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4745 sc->insert(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4746 if (sc->sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4747 s->addMember(sc, sc->sd, 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4748 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4749 return new IntegerExp(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4750
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4751 Lno:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4752 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4753 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4754
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4755 void IsExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4756 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4757 buf->writestring("is(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4758 targ->toCBuffer(buf, id, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4759 if (tok2 != TOKreserved)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4760 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4761 buf->printf(" %s %s", Token::toChars(tok), Token::toChars(tok2));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4762 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4763 else if (tspec)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4764 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4765 if (tok == TOKcolon)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4766 buf->writestring(" : ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4767 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4768 buf->writestring(" == ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4769 tspec->toCBuffer(buf, NULL, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4770 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
4771 #if DMDV2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4772 if (parameters)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4773 { // First parameter is already output, so start with second
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4774 for (int i = 1; i < parameters->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4775 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4776 buf->writeByte(',');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4777 TemplateParameter *tp = (TemplateParameter *)parameters->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4778 tp->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4779 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4780 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4781 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4782 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4783 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4784
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4785
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4786 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4787
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4788 UnaExp::UnaExp(Loc loc, enum TOK op, int size, Expression *e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4789 : Expression(loc, op, size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4790 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4791 this->e1 = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4792 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4793
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4794 Expression *UnaExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4795 { UnaExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4796
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4797 e = (UnaExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4798 e->type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4799 e->e1 = e->e1->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4800 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4801 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4802
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4803 Expression *UnaExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4804 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4805 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4806 printf("UnaExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4807 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4808 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4809 // if (!e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4810 // error("%s has no value", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4811 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4812 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4813
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4814 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4815 int UnaExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4816 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4817 return e1->canThrow();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4818 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4819 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4820
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4821 void UnaExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4822 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4823 buf->writestring(Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4824 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4825 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4826
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4827 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4828
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4829 BinExp::BinExp(Loc loc, enum TOK op, int size, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4830 : Expression(loc, op, size)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4831 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4832 this->e1 = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4833 this->e2 = e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4834 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4835
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4836 Expression *BinExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4837 { BinExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4838
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4839 e = (BinExp *)copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4840 e->type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4841 e->e1 = e->e1->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4842 e->e2 = e->e2->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4843 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4844 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4845
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4846 Expression *BinExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4847 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4848 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4849 printf("BinExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4850 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4851 e1 = e1->semantic(sc);
717
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
4852 if (!e1->type &&
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
4853 !(op == TOKassign && e1->op == TOKdottd)) // a.template = e2
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4854 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4855 error("%s has no value", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4856 e1->type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4857 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4858 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4859 if (!e2->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4860 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4861 error("%s has no value", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4862 e2->type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4863 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4864 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4865 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4866
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4867 Expression *BinExp::semanticp(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4868 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4869 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4870 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4871 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4872 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4873 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4874
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4875 /***************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4876 * Common semantic routine for some xxxAssignExp's.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4877 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4878
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4879 Expression *BinExp::commonSemanticAssign(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4880 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4881
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4882 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4883 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4884 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4885 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4886
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4887 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4888 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4889 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4890
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4891 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4892 { // T[] op= ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4893 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4894 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4895 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4896 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4897
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4898 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4899 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4900 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4901 if (type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4902 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4903 error("operator not allowed on bool expression %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4904 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4905 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4906 e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4907 e2->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4908
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4909 if (op == TOKmodass && e2->type->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4910 { error("cannot perform modulo complex arithmetic");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4911 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4912 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4913 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4914 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4915 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4916
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4917 Expression *BinExp::commonSemanticAssignIntegral(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4918 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4919
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4920 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4921 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4922 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4923 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4924
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4925 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4926 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4927 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4928
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4929 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4930 { // T[] op= ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4931 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4932 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4933 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4934 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
4935
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4936 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4937 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4938 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4939 if (type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4940 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4941 e2 = e2->implicitCastTo(sc, type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4942 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4943
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4944 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4945 e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4946 e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4947 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4948 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4949 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4950
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4951 int BinExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4952 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4953 if (op == TOKplusplus ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4954 op == TOKminusminus ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4955 op == TOKassign ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4956 op == TOKconstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4957 op == TOKblit ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4958 op == TOKaddass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4959 op == TOKminass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4960 op == TOKcatass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4961 op == TOKmulass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4962 op == TOKdivass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4963 op == TOKmodass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4964 op == TOKshlass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4965 op == TOKshrass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4966 op == TOKushrass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4967 op == TOKandass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4968 op == TOKorass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4969 op == TOKxorass ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4970 op == TOKin ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4971 op == TOKremove)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4972 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4973 return Expression::checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4974 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4975
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4976 void BinExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4977 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4978 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4979 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4980 buf->writestring(Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4981 buf->writeByte(' ');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4982 expToCBuffer(buf, hgs, e2, (enum PREC)(precedence[op] + 1));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4983 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4984
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4985 int BinExp::isunsigned()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4986 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4987 return e1->type->isunsigned() || e2->type->isunsigned();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4988 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4989
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4990 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4991 int BinExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4992 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4993 return e1->canThrow() || e2->canThrow();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4994 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4995 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
4996
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4997 void BinExp::incompatibleTypes()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4998 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
4999 error("incompatible types for ((%s) %s (%s)): '%s' and '%s'",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5000 e1->toChars(), Token::toChars(op), e2->toChars(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5001 e1->type->toChars(), e2->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5002 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5003
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5004 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5005
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5006 CompileExp::CompileExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5007 : UnaExp(loc, TOKmixin, sizeof(CompileExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5008 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5009 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5010
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5011 Expression *CompileExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5012 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5013 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5014 printf("CompileExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5015 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5016 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5017 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5018 e1 = e1->optimize(WANTvalue | WANTinterpret);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5019 if (e1->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5020 { error("argument to mixin must be a string, not (%s)", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5021 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5022 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5023 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5024 StringExp *se = (StringExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5025 se = se->toUTF8(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5026 Parser p(sc->module, (unsigned char *)se->string, se->len, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5027 p.loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5028 p.nextToken();
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5029 //printf("p.loc.linnum = %d\n", p.loc.linnum);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5030 Expression *e = p.parseExpression();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5031 if (p.token.value != TOKeof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5032 error("incomplete mixin expression (%s)", se->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5033 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5034 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5035
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5036 void CompileExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5037 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5038 buf->writestring("mixin(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5039 expToCBuffer(buf, hgs, e1, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5040 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5041 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5042
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5043 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5044
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5045 FileExp::FileExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5046 : UnaExp(loc, TOKmixin, sizeof(FileExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5047 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5048 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5049
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5050 Expression *FileExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5051 { char *name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5052 StringExp *se;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5053
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5054 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5055 printf("FileExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5056 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5057 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5058 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5059 e1 = e1->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5060 if (e1->op != TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5061 { error("file name argument must be a string, not (%s)", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5062 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5063 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5064 se = (StringExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5065 se = se->toUTF8(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5066 name = (char *)se->string;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5067
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5068 if (!global.params.fileImppath)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5069 { error("need -Jpath switch to import text file %s", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5070 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5071 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5072
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5073 if (name != FileName::name(name))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5074 { error("use -Jpath switch to provide path for filename %s", name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5075 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5076 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5077
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5078 name = FileName::searchPath(global.filePath, name, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5079 if (!name)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5080 { error("file %s cannot be found, check -Jpath", se->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5081 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5082 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5083
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5084 if (global.params.verbose)
794
661384d6a936 Fix warnings on x86-64. By fvbommel.
Christian Kamm <kamm incasoftware de>
parents: 779
diff changeset
5085 printf("file %s\t(%s)\n", (char*)se->string, name);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5086
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5087 { File f(name);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5088 if (f.read())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5089 { error("cannot read file %s", f.toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5090 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5091 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5092 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5093 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5094 f.ref = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5095 se = new StringExp(loc, f.buffer, f.len);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5096 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5097 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5098 Lret:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5099 return se->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5100
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5101 Lerror:
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5102 se = new StringExp(loc, (char *)"");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5103 goto Lret;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5104 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5105
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5106 void FileExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5107 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5108 buf->writestring("import(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5109 expToCBuffer(buf, hgs, e1, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5110 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5111 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5112
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5113 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5114
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5115 AssertExp::AssertExp(Loc loc, Expression *e, Expression *msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5116 : UnaExp(loc, TOKassert, sizeof(AssertExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5117 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5118 this->msg = msg;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5119 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5120
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5121 Expression *AssertExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5122 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5123 AssertExp *ae = new AssertExp(loc, e1->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5124 msg ? msg->syntaxCopy() : NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5125 return ae;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5126 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5128 Expression *AssertExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5129 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5130 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5131 printf("AssertExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5132 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5133 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5134 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5135 // BUG: see if we can do compile time elimination of the Assert
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5136 e1 = e1->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5137 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5138 if (msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5139 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5140 msg = msg->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5141 msg = resolveProperties(sc, msg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5142 msg = msg->implicitCastTo(sc, Type::tchar->arrayOf());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5143 msg = msg->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5144 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5145 if (e1->isBool(FALSE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5146 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5147 FuncDeclaration *fd = sc->parent->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5148 fd->hasReturnExp |= 4;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5149
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5150 if (!global.params.useAssert)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5151 { Expression *e = new HaltExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5152 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5153 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5154 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5155 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5156 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5157 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5158 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5160 int AssertExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5161 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5162 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5163 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5164
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5165 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5166 int AssertExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5167 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5168 return (global.params.useAssert != 0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5169 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5170 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5171
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5172 void AssertExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5173 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5174 buf->writestring("assert(");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5175 expToCBuffer(buf, hgs, e1, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5176 if (msg)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5177 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5178 buf->writeByte(',');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5179 expToCBuffer(buf, hgs, msg, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5180 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5181 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5182 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5184 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5185
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5186 DotIdExp::DotIdExp(Loc loc, Expression *e, Identifier *ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5187 : UnaExp(loc, TOKdot, sizeof(DotIdExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5188 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5189 this->ident = ident;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5190 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5191
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5192 Expression *DotIdExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5193 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5194 Expression *eleft;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5195 Expression *eright;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5196
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5197 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5198 printf("DotIdExp::semantic(this = %p, '%s')\n", this, toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5199 //printf("e1->op = %d, '%s'\n", e1->op, Token::toChars(e1->op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5200 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5201
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5202 //{ static int z; fflush(stdout); if (++z == 10) *(char*)0=0; }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5203
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5204 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5205 /* Don't do semantic analysis if we'll be converting
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5206 * it to a string.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5207 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5208 if (ident == Id::stringof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5209 { char *s = e1->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5210 e = new StringExp(loc, s, strlen(s), 'c');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5211 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5212 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5213 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5214 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5215
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5216 /* Special case: rewrite this.id and super.id
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5217 * to be classtype.id and baseclasstype.id
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5218 * if we have no this pointer.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5219 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5220 if ((e1->op == TOKthis || e1->op == TOKsuper) && !hasThis(sc))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5221 { ClassDeclaration *cd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5222 StructDeclaration *sd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5223 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5224
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5225 ad = sc->getStructClassScope();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5226 if (ad)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5227 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5228 cd = ad->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5229 if (cd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5230 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5231 if (e1->op == TOKthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5232 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5233 e = new TypeDotIdExp(loc, cd->type, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5234 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5235 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5236 else if (cd->baseClass && e1->op == TOKsuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5237 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5238 e = new TypeDotIdExp(loc, cd->baseClass->type, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5239 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5240 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5241 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5242 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5243 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5244 sd = ad->isStructDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5245 if (sd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5246 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5247 if (e1->op == TOKthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5249 e = new TypeDotIdExp(loc, sd->type, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5250 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5251 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5252 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5253 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5255 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5256
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5257 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5258
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5259 if (e1->op == TOKdotexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5260 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5261 DotExp *de = (DotExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5262 eleft = de->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5263 eright = de->e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5264 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5265 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5266 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5267 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5268 eleft = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5269 eright = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5270 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5271 #if DMDV2
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5272 if (e1->op == TOKtuple && ident == Id::offsetof)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5273 { /* 'distribute' the .offsetof to each of the tuple elements.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5274 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5275 TupleExp *te = (TupleExp *)e1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5276 Expressions *exps = new Expressions();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5277 exps->setDim(te->exps->dim);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5278 for (int i = 0; i < exps->dim; i++)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5279 { Expression *e = (Expression *)te->exps->data[i];
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5280 e = e->semantic(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5281 e = new DotIdExp(e->loc, e, Id::offsetof);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5282 exps->data[i] = (void *)e;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5283 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5284 e = new TupleExp(loc, exps);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5285 e = e->semantic(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5286 return e;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5287 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5288 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5289
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5290 if (e1->op == TOKtuple && ident == Id::length)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5291 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5292 TupleExp *te = (TupleExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5293 e = new IntegerExp(loc, te->exps->dim, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5294 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5295 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5296
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5297 if (eright->op == TOKimport) // also used for template alias's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5298 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5299 ScopeExp *ie = (ScopeExp *)eright;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5300
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5301 /* Disable access to another module's private imports.
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5302 * The check for 'is sds our current module' is because
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5303 * the current module should have access to its own imports.
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5304 */
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5305 Dsymbol *s = ie->sds->search(loc, ident,
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 841
diff changeset
5306 (ie->sds->isModule() && ie->sds != sc->module) ? 1 : 0);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5307 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5308 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5309 s = s->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5310 checkDeprecated(sc, s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5312 EnumMember *em = s->isEnumMember();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5313 if (em)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5314 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5315 e = em->value;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5316 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5317 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5318 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5319
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5320 VarDeclaration *v = s->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5321 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5322 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5323 //printf("DotIdExp:: Identifier '%s' is a variable, type '%s'\n", toChars(), v->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5324 if (v->inuse)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5325 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5326 error("circular reference to '%s'", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5327 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5328 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5329 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5330 type = v->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5331 if (v->isConst())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5332 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5333 if (v->init)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5335 ExpInitializer *ei = v->init->isExpInitializer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5336 if (ei)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5337 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5338 //printf("\tei: %p (%s)\n", ei->exp, ei->exp->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5339 //ei->exp = ei->exp->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5340 if (ei->exp->type == type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5341 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5342 e = ei->exp->copy(); // make copy so we can change loc
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5343 e->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5344 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5345 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5346 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5347 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5348 else if (type->isscalar())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5350 e = type->defaultInit();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5351 e->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5352 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5353 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5355 if (v->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5356 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5357 if (!eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5358 eleft = new ThisExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5359 e = new DotVarExp(loc, eleft, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5360 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5361 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5362 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5363 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5364 e = new VarExp(loc, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5365 if (eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5366 { e = new CommaExp(loc, eleft, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5367 e->type = v->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5368 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5369 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5370 return e->deref();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5373 FuncDeclaration *f = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5374 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5376 //printf("it's a function\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5377 if (f->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5378 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5379 if (!eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5380 eleft = new ThisExp(loc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5381 e = new DotVarExp(loc, eleft, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5382 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5383 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5384 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5385 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5386 e = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5387 if (eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5388 { e = new CommaExp(loc, eleft, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5389 e->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5390 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5391 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5392 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5393 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5394 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5395 OverloadSet *o = s->isOverloadSet();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5396 if (o)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5397 { //printf("'%s' is an overload set\n", o->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5398 return new OverExp(o);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5399 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5400 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5401
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5402 Type *t = s->getType();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5403 if (t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5404 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5405 return new TypeExp(loc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5406 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5407
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5408 TupleDeclaration *tup = s->isTupleDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5409 if (tup)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5410 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5411 if (eleft)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5412 error("cannot have e.tuple");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5413 e = new TupleExp(loc, tup);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5414 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5415 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5416 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5417
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5418 ScopeDsymbol *sds = s->isScopeDsymbol();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5419 if (sds)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5420 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5421 //printf("it's a ScopeDsymbol\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5422 e = new ScopeExp(loc, sds);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5423 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5424 if (eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5425 e = new DotExp(loc, eleft, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5426 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5427 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5429 Import *imp = s->isImport();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5430 if (imp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5431 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5432 ScopeExp *ie;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5433
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5434 ie = new ScopeExp(loc, imp->pkg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5435 return ie->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5436 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5437
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5438 // BUG: handle other cases like in IdentifierExp::semantic()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5439 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5440 printf("s = '%s', kind = '%s'\n", s->toChars(), s->kind());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5441 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5442 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5443 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5444 else if (ident == Id::stringof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5445 { char *s = ie->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5446 e = new StringExp(loc, s, strlen(s), 'c');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5447 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5448 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5449 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5450 error("undefined identifier %s", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5451 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5452 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5453 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5454 else if (e1->type->ty == Tpointer &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5455 ident != Id::init && ident != Id::__sizeof &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5456 ident != Id::alignof && ident != Id::offsetof &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5457 ident != Id::mangleof && ident != Id::stringof)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5458 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5459 e = new PtrExp(loc, e1);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5460 e->type = ((TypePointer *)e1->type)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5461 return e->type->dotExp(sc, e, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5462 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5463 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5464 else if (t1b->ty == Tarray ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5465 t1b->ty == Tsarray ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5466 t1b->ty == Taarray)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5467 { /* If ident is not a valid property, rewrite:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5468 * e1.ident
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5469 * as:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5470 * .ident(e1)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5471 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5472 unsigned errors = global.errors;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5473 global.gag++;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5474 e = e1->type->dotExp(sc, e1, ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5475 global.gag--;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5476 if (errors != global.errors) // if failed to find the property
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5477 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5478 global.errors = errors;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5479 e = new DotIdExp(loc, new IdentifierExp(loc, Id::empty), ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5480 e = new CallExp(loc, e, e1);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5481 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5482 e = e->semantic(sc);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5483 return e;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5484 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5485 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5486 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5487 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5488 e = e1->type->dotExp(sc, e1, ident);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5489 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5490 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5491 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5492 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5493
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5494 void DotIdExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5495 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5496 //printf("DotIdExp::toCBuffer()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5497 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5498 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5499 buf->writestring(ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5500 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5501
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5502 /********************** DotTemplateExp ***********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5503
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5504 // Mainly just a placeholder
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5505
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5506 DotTemplateExp::DotTemplateExp(Loc loc, Expression *e, TemplateDeclaration *td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5507 : UnaExp(loc, TOKdottd, sizeof(DotTemplateExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5508
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5509 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5510 this->td = td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5511 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5512
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5513 void DotTemplateExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5514 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5515 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5516 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5517 buf->writestring(td->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5518 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5519
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5520
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5521 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5522
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5523 DotVarExp::DotVarExp(Loc loc, Expression *e, Declaration *v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5524 : UnaExp(loc, TOKdotvar, sizeof(DotVarExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5525 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5526 //printf("DotVarExp()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5527 this->var = v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5528 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5529
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5530 Expression *DotVarExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5531 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5532 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5533 printf("DotVarExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5534 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5535 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5536 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5537 var = var->toAlias()->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5538
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5539 TupleDeclaration *tup = var->isTupleDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5540 if (tup)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5541 { /* Replace:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5542 * e1.tuple(a, b, c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5543 * with:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5544 * tuple(e1.a, e1.b, e1.c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5545 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5546 Expressions *exps = new Expressions;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5547
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5548 exps->reserve(tup->objects->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5549 for (size_t i = 0; i < tup->objects->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5550 { Object *o = (Object *)tup->objects->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5551 if (o->dyncast() != DYNCAST_EXPRESSION)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5552 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5553 error("%s is not an expression", o->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5554 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5555 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5556 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5557 Expression *e = (Expression *)o;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5558 if (e->op != TOKdsymbol)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5559 error("%s is not a member", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5560 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5561 { DsymbolExp *ve = (DsymbolExp *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5562
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5563 e = new DotVarExp(loc, e1, ve->s->isDeclaration());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5564 exps->push(e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5565 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5566 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5567 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5568 Expression *e = new TupleExp(loc, exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5569 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5570 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5571 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5573 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5574 type = var->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5575 if (!type && global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5576 { // var is goofed up, just return 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5577 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5578 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5579 assert(type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5580
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5581 if (!var->isFuncDeclaration()) // for functions, do checks after overload resolution
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5582 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5583 AggregateDeclaration *ad = var->toParent()->isAggregateDeclaration();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5584 e1 = getRightThis(loc, sc, ad, e1, var);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5585 if (!sc->noaccesscheck)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5586 accessCheck(loc, sc, e1, var);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5587
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5588 VarDeclaration *v = var->isVarDeclaration();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5589 if (v && v->isConst())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5590 { ExpInitializer *ei = v->getExpInitializer();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5591 if (ei)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5592 { Expression *e = ei->exp->copy();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5593 e = e->semantic(sc);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5594 return e;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5595 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5596 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5597 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5598 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5599 //printf("-DotVarExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5600 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5601 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5602
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5603 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5604 int DotVarExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5605 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5606 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5607 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5608 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5609
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5610 Expression *DotVarExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5611 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5612 //printf("DotVarExp::toLvalue(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5613 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5614 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5615
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5616 Expression *DotVarExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5617 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5618 #if 0
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5619 printf("DotVarExp::modifiableLvalue(%s)\n", toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5620 printf("e1->type = %s\n", e1->type->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5621 printf("var->type = %s\n", var->type->toChars());
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5622 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5623
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5624 if (var->isCtorinit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5625 { // It's only modifiable if inside the right constructor
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5626 Dsymbol *s = sc->func;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5627 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5628 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5629 FuncDeclaration *fd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5630 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5631 fd = s->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5632 if (fd &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5633 ((fd->isCtorDeclaration() && var->storage_class & STCfield) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5634 (fd->isStaticCtorDeclaration() && !(var->storage_class & STCfield))) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5635 fd->toParent() == var->toParent() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5636 e1->op == TOKthis
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5637 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5638 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5639 VarDeclaration *v = var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5640 assert(v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5641 v->ctorinit = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5642 //printf("setting ctorinit\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5643 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5644 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5645 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5646 if (s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5647 { s = s->toParent2();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5648 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5649 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5650 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5651 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5652 const char *p = var->isStatic() ? "static " : "";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5653 error("can only initialize %sconst member %s inside %sconstructor",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5654 p, var->toChars(), p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5655 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5656 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5657 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5658 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5659 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5660 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5661 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5662 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5663 Type *t1 = e1->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5664
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5665 if (!t1->isMutable() ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5666 (t1->ty == Tpointer && !t1->nextOf()->isMutable()) ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5667 !var->type->isMutable() ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5668 !var->type->isAssignable() ||
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5669 var->storage_class & STCmanifest
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5670 )
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5671 error("cannot modify const/invariant %s", toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5672 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5673 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5674 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5675 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5676
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5677 void DotVarExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5678 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5679 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5680 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5681 buf->writestring(var->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5682 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5683
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5684 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5685
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5686 /* Things like:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5687 * foo.bar!(args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5688 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5689
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5690 DotTemplateInstanceExp::DotTemplateInstanceExp(Loc loc, Expression *e, TemplateInstance *ti)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5691 : UnaExp(loc, TOKdotti, sizeof(DotTemplateInstanceExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5692 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5693 //printf("DotTemplateInstanceExp()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5694 this->ti = ti;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5695 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5696
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5697 Expression *DotTemplateInstanceExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5698 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5699 DotTemplateInstanceExp *de = new DotTemplateInstanceExp(loc,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5700 e1->syntaxCopy(),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5701 (TemplateInstance *)ti->syntaxCopy(NULL));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5702 return de;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5703 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5704
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5705 Expression *DotTemplateInstanceExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5706 { Dsymbol *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5707 Dsymbol *s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5708 TemplateDeclaration *td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5709 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5710 Identifier *id;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5711 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5712 Expression *eleft = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5713 Expression *eright;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5714
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5715 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5716 printf("DotTemplateInstanceExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5717 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5718 //e1->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5719 //print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5720 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5721 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5722 if (t1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5723 t1 = t1->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5724 //t1->print();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5725
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5726 /* Extract the following from e1:
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5727 * s: the symbol which ti should be a member of
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5728 * eleft: if not NULL, it is the 'this' pointer for ti
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5729 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5730
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5731 if (e1->op == TOKdotexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5732 { DotExp *de = (DotExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5733 eleft = de->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5734 eright = de->e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5735 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5736 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5737 { eleft = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5738 eright = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5740 if (eright->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5741 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5742 s = ((ScopeExp *)eright)->sds;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5743 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5744 else if (e1->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5745 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5746 s = t1->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5747 if (!s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5748 { if (t1->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5749 s = ((TypeStruct *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5750 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5751 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5752 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5753 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5754 else if (t1 && (t1->ty == Tstruct || t1->ty == Tclass))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5755 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5756 s = t1->toDsymbol(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5757 eleft = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5758 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5759 else if (t1 && t1->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5760 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5761 t1 = ((TypePointer *)t1)->next->toBasetype();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5762 if (t1->ty != Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5763 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5764 s = t1->toDsymbol(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5765 eleft = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5766 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5767 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5768 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5769 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5770 error("template %s is not a member of %s", ti->toChars(), e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5771 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5772 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5773
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5774 assert(s);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5775 id = ti->name;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5776 s2 = s->search(loc, id, 0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5777 if (!s2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5778 { error("template identifier %s is not a member of %s %s", id->toChars(), s->kind(), s->ident->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5779 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5780 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5781 s = s2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5782 s->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5783 s = s->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5784 td = s->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5785 if (!td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5786 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5787 error("%s is not a template", id->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5788 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5789 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5790 if (global.errors)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5791 goto Lerr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5792
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5793 ti->tempdecl = td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5794
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5795 if (eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5796 { Declaration *v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5797
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5798 ti->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5799 s = ti->inst->toAlias();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5800 v = s->isDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5801 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5802 { e = new DotVarExp(loc, eleft, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5803 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5804 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5805 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5806 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5807
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5808 e = new ScopeExp(loc, ti);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5809 if (eleft)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5810 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5811 e = new DotExp(loc, eleft, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5812 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5813 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5814 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5816 Lerr:
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5817 return new IntegerExp(loc, 0, Type::tint32);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5818 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5819
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5820 void DotTemplateInstanceExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5821 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5822 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5823 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5824 ti->toCBuffer(buf, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5825 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5826
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5827 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5828
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5829 DelegateExp::DelegateExp(Loc loc, Expression *e, FuncDeclaration *f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5830 : UnaExp(loc, TOKdelegate, sizeof(DelegateExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5831 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5832 this->func = f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5833 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5834
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5835 Expression *DelegateExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5836 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5837 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5838 printf("DelegateExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5839 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5840 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5841 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5842 e1 = e1->semantic(sc);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
5843 // LDC we need a copy as we store the LLVM tpye in TypeFunction, and delegate/members have different types for 'this'
471
e19e20103119 Changed DMD to make a copy of the TypeFunction in DelegateExp.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 468
diff changeset
5844 type = new TypeDelegate(func->type->syntaxCopy());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5845 type = type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5846 AggregateDeclaration *ad = func->toParent()->isAggregateDeclaration();
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5847 if (func->needThis())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
5848 e1 = getRightThis(loc, sc, ad, e1, func);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5849 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5850 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5851 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5852
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5853 void DelegateExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5854 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5855 buf->writeByte('&');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5856 if (!func->isNested())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5857 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5858 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5859 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5860 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5861 buf->writestring(func->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5862 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5863
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5864 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5865
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5866 DotTypeExp::DotTypeExp(Loc loc, Expression *e, Dsymbol *s)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5867 : UnaExp(loc, TOKdottype, sizeof(DotTypeExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5868 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5869 this->sym = s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5870 this->type = s->getType();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5871 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5872
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5873 Expression *DotTypeExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5874 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5875 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5876 printf("DotTypeExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5877 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5878 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5879 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5880 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5881
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5882 void DotTypeExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5883 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5884 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5885 buf->writeByte('.');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5886 buf->writestring(sym->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5887 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5888
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5889 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5890
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5891 CallExp::CallExp(Loc loc, Expression *e, Expressions *exps)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5892 : UnaExp(loc, TOKcall, sizeof(CallExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5893 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5894 this->arguments = exps;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5895 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5896
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5897 CallExp::CallExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5898 : UnaExp(loc, TOKcall, sizeof(CallExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5899 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5900 this->arguments = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5901 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5902
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5903 CallExp::CallExp(Loc loc, Expression *e, Expression *earg1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5904 : UnaExp(loc, TOKcall, sizeof(CallExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5905 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5906 Expressions *arguments = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5907 arguments->setDim(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5908 arguments->data[0] = (void *)earg1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5909
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5910 this->arguments = arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5911 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5912
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5913 CallExp::CallExp(Loc loc, Expression *e, Expression *earg1, Expression *earg2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5914 : UnaExp(loc, TOKcall, sizeof(CallExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5915 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5916 Expressions *arguments = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5917 arguments->setDim(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5918 arguments->data[0] = (void *)earg1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5919 arguments->data[1] = (void *)earg2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5920
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5921 this->arguments = arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5922 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5923
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5924 Expression *CallExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5925 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5926 return new CallExp(loc, e1->syntaxCopy(), arraySyntaxCopy(arguments));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5927 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5928
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5929
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5930 Expression *CallExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5931 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5932 TypeFunction *tf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5933 FuncDeclaration *f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5934 int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5935 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5936 int istemp;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
5937 Objects *targsi = NULL; // initial list of template arguments
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5938
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5939 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5940 printf("CallExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5941 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5942 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5943 return this; // semantic() already run
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5944 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5945 if (arguments && arguments->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5946 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5947 Expression *earg = (Expression *)arguments->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5948 earg->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5949 if (earg->type) earg->type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5950 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5951 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5952
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5953 if (e1->op == TOKdelegate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5954 { DelegateExp *de = (DelegateExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5956 e1 = new DotVarExp(de->loc, de->e1, de->func);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5957 return semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5958 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5959
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5960 /* Transform:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5961 * array.id(args) into id(array,args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5962 * aa.remove(arg) into delete aa[arg]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5963 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5964 if (e1->op == TOKdot)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5965 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5966 // BUG: we should handle array.a.b.c.e(args) too
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5967
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5968 DotIdExp *dotid = (DotIdExp *)(e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5969 dotid->e1 = dotid->e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5970 assert(dotid->e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5971 if (dotid->e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5972 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5973 TY e1ty = dotid->e1->type->toBasetype()->ty;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5974 if (e1ty == Taarray && dotid->ident == Id::remove)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5975 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5976 if (!arguments || arguments->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5977 { error("expected key as argument to aa.remove()");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5978 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5979 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5980 Expression *key = (Expression *)arguments->data[0];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5981 key = key->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5982 key = resolveProperties(sc, key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5983 key->rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5984
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5985 TypeAArray *taa = (TypeAArray *)dotid->e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5986 key = key->implicitCastTo(sc, taa->index);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5987 key = key->implicitCastTo(sc, taa->key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5988
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5989 return new RemoveExp(loc, dotid->e1, key);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5990 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5991 else if (e1ty == Tarray || e1ty == Tsarray || e1ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5992 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5993 if (!arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5994 arguments = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5995 arguments->shift(dotid->e1);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5996 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5997 e1 = new DotIdExp(dotid->loc, new IdentifierExp(dotid->loc, Id::empty), dotid->ident);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
5998 #else
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
5999 e1 = new IdentifierExp(dotid->loc, dotid->ident);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6000 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6001 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6002 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6003 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6004
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6005 #if 1
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6006 /* This recognizes:
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6007 * foo!(tiargs)(funcargs)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6008 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6009 if (e1->op == TOKimport && !e1->type)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6010 { ScopeExp *se = (ScopeExp *)e1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6011 TemplateInstance *ti = se->sds->isTemplateInstance();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6012 if (ti && !ti->semanticdone)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6013 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6014 /* Attempt to instantiate ti. If that works, go with it.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6015 * If not, go with partial explicit specialization.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6016 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6017 ti->semanticTiargs(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6018 unsigned errors = global.errors;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6019 global.gag++;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6020 ti->semantic(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6021 global.gag--;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6022 if (errors != global.errors)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6023 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6024 /* Didn't work, go with partial explicit specialization
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6025 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6026 global.errors = errors;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6027 targsi = ti->tiargs;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6028 e1 = new IdentifierExp(loc, ti->name);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6029 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6030 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6031 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6032
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6033 /* This recognizes:
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6034 * expr.foo!(tiargs)(funcargs)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6035 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6036 if (e1->op == TOKdotti && !e1->type)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6037 { DotTemplateInstanceExp *se = (DotTemplateInstanceExp *)e1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6038 TemplateInstance *ti = se->ti;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6039 if (!ti->semanticdone)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6040 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6041 /* Attempt to instantiate ti. If that works, go with it.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6042 * If not, go with partial explicit specialization.
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6043 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6044 ti->semanticTiargs(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6045 Expression *etmp;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6046 unsigned errors = global.errors;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6047 global.gag++;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6048 etmp = e1->semantic(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6049 global.gag--;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6050 if (errors != global.errors)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6051 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6052 global.errors = errors;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6053 targsi = ti->tiargs;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6054 e1 = new DotIdExp(loc, se->e1, ti->name);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6055 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6056 else
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6057 e1 = etmp;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6058 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6059 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6060 #endif
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6061
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6062 istemp = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6063 Lagain:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6064 //printf("Lagain: %s\n", toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6065 f = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6066 if (e1->op == TOKthis || e1->op == TOKsuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6067 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6068 // semantic() run later for these
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6069 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6070 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6071 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6072 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6073
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6074 /* Look for e1 being a lazy parameter
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6075 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6076 if (e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6077 { VarExp *ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6078
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6079 if (ve->var->storage_class & STClazy)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6080 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6081 TypeFunction *tf = new TypeFunction(NULL, ve->var->type, 0, LINKd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6082 TypeDelegate *t = new TypeDelegate(tf);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6083 ve->type = t->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6084 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6085 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6086
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6087 if (e1->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6088 { // Perhaps this should be moved to ScopeExp::semantic()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6089 ScopeExp *se = (ScopeExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6090 e1 = new DsymbolExp(loc, se->sds);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6091 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6092 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6093 #if 1 // patch for #540 by Oskar Linde
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6094 else if (e1->op == TOKdotexp)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6095 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6096 DotExp *de = (DotExp *) e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6097
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6098 if (de->e2->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6099 { // This should *really* be moved to ScopeExp::semantic()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6100 ScopeExp *se = (ScopeExp *)de->e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6101 de->e2 = new DsymbolExp(loc, se->sds);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6102 de->e2 = de->e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6103 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6104
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6105 if (de->e2->op == TOKtemplate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6106 { TemplateExp *te = (TemplateExp *) de->e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6107 e1 = new DotTemplateExp(loc,de->e1,te->td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6108 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6110 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6111 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6112
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6113 if (e1->op == TOKcomma)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6114 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6115 CommaExp *ce = (CommaExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6116
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6117 e1 = ce->e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6118 e1->type = ce->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6119 ce->e2 = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6120 ce->type = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6121 return ce->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6122 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6123
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6124 t1 = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6125 if (e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6126 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6127
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6128 // Check for call operator overload
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6129 if (t1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6130 { AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6131
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6132 if (t1->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6133 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6134 ad = ((TypeStruct *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6135 if (search_function(ad, Id::call))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6136 goto L1; // overload of opCall, therefore it's a call
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6137
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6138 if (e1->op != TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6139 error("%s %s does not overload ()", ad->kind(), ad->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6140 /* It's a struct literal
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6141 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6142 Expression *e = new StructLiteralExp(loc, (StructDeclaration *)ad, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6143 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6144 e->type = e1->type; // in case e1->type was a typedef
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6145 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6146 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6147 else if (t1->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6148 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6149 ad = ((TypeClass *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6150 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6151 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6152 // Rewrite as e1.call(arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6153 Expression *e = new DotIdExp(loc, e1, Id::call);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6154 e = new CallExp(loc, e, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6155 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6156 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6157 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6158 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6160 arrayExpressionSemantic(arguments, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6161 preFunctionArguments(loc, sc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6163 if (e1->op == TOKdotvar && t1->ty == Tfunction ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6164 e1->op == TOKdottd)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6165 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6166 DotVarExp *dve;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6167 DotTemplateExp *dte;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6168 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6169 UnaExp *ue = (UnaExp *)(e1);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6170
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6171 if (e1->op == TOKdotvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6172 { // Do overload resolution
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6173 dve = (DotVarExp *)(e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6174
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6175 f = dve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6176 assert(f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6177 f = f->overloadResolve(loc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6178
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6179 ad = f->toParent()->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6180 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6181 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6182 { dte = (DotTemplateExp *)(e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6183 TemplateDeclaration *td = dte->td;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6184 assert(td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6185 if (!arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6186 // Should fix deduceFunctionTemplate() so it works on NULL argument
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6187 arguments = new Expressions();
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6188 f = td->deduceFunctionTemplate(sc, loc, targsi, NULL, arguments);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6189 if (!f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6190 { type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6191 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6192 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6193 ad = td->toParent()->isAggregateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6194 }
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6195 if (f->needThis())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6196 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6197 ue->e1 = getRightThis(loc, sc, ad, ue->e1, f);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6198 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6199
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6200 /* Cannot call public functions from inside invariant
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6201 * (because then the invariant would have infinite recursion)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6202 */
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6203 if (sc->func && sc->func->isInvariantDeclaration() &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6204 ue->e1->op == TOKthis &&
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6205 f->addPostInvariant()
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6206 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6207 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6208 error("cannot call public/export function %s from invariant", f->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6209 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6211 checkDeprecated(sc, f);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6212 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6213 checkPurity(sc, f);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6214 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6215 accessCheck(loc, sc, ue->e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6216 if (!f->needThis())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6217 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6218 VarExp *ve = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6219 e1 = new CommaExp(loc, ue->e1, ve);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6220 e1->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6221 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6222 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6223 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6224 if (e1->op == TOKdotvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6225 dve->var = f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6226 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6227 e1 = new DotVarExp(loc, dte->e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6228 e1->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6229
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6230 // See if we need to adjust the 'this' pointer
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6231 AggregateDeclaration *ad = f->isThis();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6232 ClassDeclaration *cd = ue->e1->type->isClassHandle();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6233 if (ad && cd && ad->isClassDeclaration() && ad != cd &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6234 ue->e1->op != TOKsuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6235 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6236 ue->e1 = ue->e1->castTo(sc, ad->type); //new CastExp(loc, ue->e1, ad->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6237 ue->e1 = ue->e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6238 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6239 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6240 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6241 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6242 else if (e1->op == TOKsuper)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6243 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6244 // Base class constructor call
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6245 ClassDeclaration *cd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6246
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6247 if (sc->func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6248 cd = sc->func->toParent()->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6249 if (!cd || !cd->baseClass || !sc->func->isCtorDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6250 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6251 error("super class constructor call must be in a constructor");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6252 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6253 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6255 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6256 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6257 f = cd->baseClass->ctor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6258 if (!f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6259 { error("no super class constructor for %s", cd->baseClass->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6260 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6261 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6262 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6263 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6264 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6265 if (!sc->intypeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6266 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6267 #if 0
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6268 if (sc->callSuper & (CSXthis | CSXsuper))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6269 error("reference to this before super()");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6270 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6271 if (sc->noctor || sc->callSuper & CSXlabel)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6272 error("constructor calls not allowed in loops or after labels");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6273 if (sc->callSuper & (CSXsuper_ctor | CSXthis_ctor))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6274 error("multiple constructor calls");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6275 sc->callSuper |= CSXany_ctor | CSXsuper_ctor;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6276 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6277
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6278 f = f->overloadResolve(loc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6279 checkDeprecated(sc, f);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6280 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6281 checkPurity(sc, f);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6282 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6283 e1 = new DotVarExp(e1->loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6284 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6285 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6286 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6287 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6288 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6289 else if (e1->op == TOKthis)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6290 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6291 // same class constructor call
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6292 ClassDeclaration *cd = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6293
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6294 if (sc->func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6295 cd = sc->func->toParent()->isClassDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6296 if (!cd || !sc->func->isCtorDeclaration())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6297 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6298 error("class constructor call must be in a constructor");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6299 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6300 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6301 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6302 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6303 {
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6304 if (!sc->intypeof)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6305 {
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6306 #if 0
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6307 if (sc->callSuper & (CSXthis | CSXsuper))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6308 error("reference to this before super()");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6309 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6310 if (sc->noctor || sc->callSuper & CSXlabel)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6311 error("constructor calls not allowed in loops or after labels");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6312 if (sc->callSuper & (CSXsuper_ctor | CSXthis_ctor))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6313 error("multiple constructor calls");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6314 sc->callSuper |= CSXany_ctor | CSXthis_ctor;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 328
diff changeset
6315 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6317 f = cd->ctor;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6318 f = f->overloadResolve(loc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6319 checkDeprecated(sc, f);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6320 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6321 checkPurity(sc, f);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6322 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6323 e1 = new DotVarExp(e1->loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6324 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6325 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6326
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6327 // BUG: this should really be done by checking the static
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6328 // call graph
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6329 if (f == sc->func)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6330 error("cyclic constructor call");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6331 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6332 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6333 else if (!t1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6335 error("function expected before (), not '%s'", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6336 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6337 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6338 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6339 else if (t1->ty != Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6340 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6341 if (t1->ty == Tdelegate)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6342 { TypeDelegate *td = (TypeDelegate *)t1;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6343 assert(td->next->ty == Tfunction);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6344 tf = (TypeFunction *)(td->next);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6345 goto Lcheckargs;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6346 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6347 else if (t1->ty == Tpointer && ((TypePointer *)t1)->next->ty == Tfunction)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6348 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6349
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6350 e = new PtrExp(loc, e1);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6351 t1 = ((TypePointer *)t1)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6352 e->type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6353 e1 = e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6354 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6355 else if (e1->op == TOKtemplate)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6356 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6357 TemplateExp *te = (TemplateExp *)e1;
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6358 f = te->td->deduceFunctionTemplate(sc, loc, targsi, NULL, arguments);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6359 if (!f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6360 { type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6361 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6362 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6363 if (f->needThis() && hasThis(sc))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6364 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6365 // Supply an implicit 'this', as in
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6366 // this.ident
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6367
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6368 e1 = new DotTemplateExp(loc, (new ThisExp(loc))->semantic(sc), te->td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6369 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6370 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6371
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6372 e1 = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6373 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6374 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6375 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6376 { error("function expected before (), not %s of type %s", e1->toChars(), e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6377 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6378 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6379 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6380 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6381 else if (e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6382 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6383 // Do overload resolution
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6384 VarExp *ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6385
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6386 f = ve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6387 assert(f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6388
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6389 // Look to see if f is really a function template
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6390 if (0 && !istemp && f->parent)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6391 { TemplateInstance *ti = f->parent->isTemplateInstance();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6392
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6393 if (ti &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6394 (ti->name == f->ident ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6395 ti->toAlias()->ident == f->ident)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6396 &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6397 ti->tempdecl)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6398 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6399 /* This is so that one can refer to the enclosing
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6400 * template, even if it has the same name as a member
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6401 * of the template, if it has a !(arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6402 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6403 TemplateDeclaration *tempdecl = ti->tempdecl;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6404 if (tempdecl->overroot) // if not start of overloaded list of TemplateDeclaration's
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6405 tempdecl = tempdecl->overroot; // then get the start
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6406 e1 = new TemplateExp(loc, tempdecl);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6407 istemp = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6408 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6410 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6411
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6412 f = f->overloadResolve(loc, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6413 checkDeprecated(sc, f);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6414 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6415 checkPurity(sc, f);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6416 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6417
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6418 if (f->needThis() && hasThis(sc))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6419 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6420 // Supply an implicit 'this', as in
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6421 // this.ident
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6423 e1 = new DotVarExp(loc, new ThisExp(loc), f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6424 goto Lagain;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6425 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6426
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6427 accessCheck(loc, sc, NULL, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6428
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6429 ve->var = f;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6430 ve->type = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6431 t1 = f->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6433 assert(t1->ty == Tfunction);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6434 tf = (TypeFunction *)(t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6435
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6436 Lcheckargs:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6437 assert(tf->ty == Tfunction);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6438 type = tf->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6439
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6440 if (!arguments)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6441 arguments = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6442 functionArguments(loc, sc, tf, arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6443
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6444 assert(type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6445
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6446 if (f && f->tintro)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6447 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6448 Type *t = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6449 int offset = 0;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6450 TypeFunction *tf = (TypeFunction *)f->tintro;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6451
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6452 if (tf->next->isBaseOf(t, &offset) && offset)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6453 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6454 type = tf->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6455 return castTo(sc, t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6456 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6457 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6458
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6459 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6460 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6462 int CallExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6463 {
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6464 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6465 if (flag != 2)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6466 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6467
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6468 if (e1->checkSideEffect(2))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6469 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6470
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6471 /* If any of the arguments have side effects, this expression does
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6472 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6473 for (size_t i = 0; i < arguments->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6474 { Expression *e = (Expression *)arguments->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6475
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6476 if (e->checkSideEffect(2))
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6477 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6478 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6479
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6480 /* If calling a function or delegate that is typed as pure,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6481 * then this expression has no side effects.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6482 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6483 Type *t = e1->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6484 if (t->ty == Tfunction && ((TypeFunction *)t)->ispure)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6485 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6486 if (t->ty == Tdelegate && ((TypeFunction *)((TypeDelegate *)t)->next)->ispure)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6487 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6488 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6489 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6490 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6491
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6492 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6493 int CallExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6494 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6495 if (e1->canThrow())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6496 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6497
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6498 /* If any of the arguments can throw, then this expression can throw
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6499 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6500 for (size_t i = 0; i < arguments->dim; i++)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6501 { Expression *e = (Expression *)arguments->data[i];
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6502
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6503 if (e->canThrow())
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6504 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6505 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6506
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6507 /* If calling a function or delegate that is typed as nothrow,
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6508 * then this expression cannot throw.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6509 * Note that pure functions can throw.
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6510 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6511 Type *t = e1->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6512 if (t->ty == Tfunction && ((TypeFunction *)t)->isnothrow)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6513 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6514 if (t->ty == Tdelegate && ((TypeFunction *)((TypeDelegate *)t)->next)->isnothrow)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6515 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6516
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6517 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6518 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6519 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6520
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6521 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6522 int CallExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6523 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6524 if (type->toBasetype()->ty == Tstruct)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6525 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6526 Type *tb = e1->type->toBasetype();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6527 if (tb->ty == Tfunction && ((TypeFunction *)tb)->isref)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6528 return 1; // function returns a reference
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6529 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6530 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6531 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6532
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6533 Expression *CallExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6534 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6535 if (type->toBasetype()->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6536 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6537 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6538 return Expression::toLvalue(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6539 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6540
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6541 void CallExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6542 { int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6543
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6544 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6545 buf->writeByte('(');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6546 argsToCBuffer(buf, arguments, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6547 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6548 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6549
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6550
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6551 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6552
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6553 AddrExp::AddrExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6554 : UnaExp(loc, TOKaddress, sizeof(AddrExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6555 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6556 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6557
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6558 Expression *AddrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6559 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6560 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6561 printf("AddrExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6562 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6563 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6564 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6565 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6566 e1 = e1->toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6567 if (!e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6568 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6569 error("cannot take address of %s", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6570 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6571 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6572 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6573 type = e1->type->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6574
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6575 // See if this should really be a delegate
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6576 if (e1->op == TOKdotvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6577 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6578 DotVarExp *dve = (DotVarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6579 FuncDeclaration *f = dve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6580
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6581 if (f)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6582 { Expression *e = new DelegateExp(loc, dve->e1, f);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6583 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6584 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6585 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6586 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6587 else if (e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6588 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6589 VarExp *dve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6590 FuncDeclaration *f = dve->var->isFuncDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6591 VarDeclaration *v = dve->var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6592
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
6593 // LDC
486
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6594 if (f && f->isIntrinsic())
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6595 {
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6596 error("cannot take the address of intrinsic function %s", e1->toChars());
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6597 return this;
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6598 }
a34078905d01 Added pragma(llvmdc, "string") for misc per-module compiler configuration, currently "string" can only be "verbose" which forces -vv for module it appears in.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 471
diff changeset
6599
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6600 if (f && f->isNested())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6601 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6603 e = new DelegateExp(loc, e1, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6604 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6605 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6606 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6607 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6608 else if (e1->op == TOKarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6609 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6610 if (e1->type->toBasetype()->ty == Tbit)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6611 error("cannot take address of bit in array");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6612 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6613 return optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6614 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6615 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6616 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6617
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6618 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6619
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6620 PtrExp::PtrExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6621 : UnaExp(loc, TOKstar, sizeof(PtrExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6622 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6623 if (e->type)
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6624 type = ((TypePointer *)e->type)->next;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6625 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6626
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6627 PtrExp::PtrExp(Loc loc, Expression *e, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6628 : UnaExp(loc, TOKstar, sizeof(PtrExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6629 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6630 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6631 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6632
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6633 Expression *PtrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6634 { Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6635
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6636 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6637 printf("PtrExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6638 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6639 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6640 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6641 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6642 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6643 if (!e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6644 printf("PtrExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6645 tb = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6646 switch (tb->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6647 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6648 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6649 type = tb->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6650 if (type->isbit())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6651 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6652
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6653 // Rewrite *p as p[0]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6654 e = new IndexExp(loc, e1, new IntegerExp(0));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6655 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6656 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6657 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6658
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6659 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6660 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6661 type = tb->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6662 e1 = e1->castTo(sc, type->pointerTo());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6663 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6664
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6665 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6666 error("can only * a pointer, not a '%s'", e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6667 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6668 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6669 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6670 rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6671 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6672 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6673
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6674 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6675 int PtrExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6676 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6677 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6678 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6679 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6680
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6681 Expression *PtrExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6682 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6683 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6684 tym = tybasic(e1->ET->Tty);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6685 if (!(tyscalar(tym) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6686 tym == TYstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6687 tym == TYarray && e->Eoper == TOKaddr))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6688 synerr(EM_lvalue); // lvalue expected
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6689 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6690 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6691 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6692
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6693 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6694 Expression *PtrExp::modifiableLvalue(Scope *sc, Expression *e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6695 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6696 //printf("PtrExp::modifiableLvalue() %s, type %s\n", toChars(), type->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6697
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6698 if (e1->op == TOKsymoff)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6699 { SymOffExp *se = (SymOffExp *)e1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6700 se->var->checkModify(loc, sc, type);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6701 //return toLvalue(sc, e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6702 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6703
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6704 return Expression::modifiableLvalue(sc, e);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6705 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6706 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6707
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6708 void PtrExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6709 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6710 buf->writeByte('*');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6711 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6712 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6713
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6714 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6715
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6716 NegExp::NegExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6717 : UnaExp(loc, TOKneg, sizeof(NegExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6718 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6719 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6720
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6721 Expression *NegExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6722 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6723
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6724 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6725 printf("NegExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6726 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6727 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6728 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6729 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6730 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6731 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6732 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6733 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6734
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6735 e1->checkNoBool();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6736 if (e1->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6737 e1->checkArithmetic();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6738 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6739 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6740 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6741 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6742
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6743 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6744
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6745 UAddExp::UAddExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6746 : UnaExp(loc, TOKuadd, sizeof(UAddExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6747 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6748 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6749
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6750 Expression *UAddExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6751 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6752
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6753 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6754 printf("UAddExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6755 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6756 assert(!type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6757 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6758 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6759 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6760 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6761 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6762 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6763 e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6764 return e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6765 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6766
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6767 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6768
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6769 ComExp::ComExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6770 : UnaExp(loc, TOKtilde, sizeof(ComExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6771 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6772 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6773
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6774 Expression *ComExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6775 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6776
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6777 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6778 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6779 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6780 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6781 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6782 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6783 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6784
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6785 e1->checkNoBool();
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6786 if (e1->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6787 e1 = e1->checkIntegral();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6788 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6789 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6790 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6791 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6792
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6793 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6794
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6795 NotExp::NotExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6796 : UnaExp(loc, TOKnot, sizeof(NotExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6797 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6798 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6799
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6800 Expression *NotExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6801 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6802 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6803 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6804 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6805 type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6806 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6807 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6808
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6809 int NotExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6810 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6811 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6812 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6813
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6814
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6815
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6816 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6817
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6818 BoolExp::BoolExp(Loc loc, Expression *e, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6819 : UnaExp(loc, TOKtobool, sizeof(BoolExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6820 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6821 type = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6822 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6823
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6824 Expression *BoolExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6825 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6826 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6827 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6828 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6829 type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6830 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6831 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6832
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6833 int BoolExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6834 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6835 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6836 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6837
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6838 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6839
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6840 DeleteExp::DeleteExp(Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6841 : UnaExp(loc, TOKdelete, sizeof(DeleteExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6842 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6843 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6844
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6845 Expression *DeleteExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6846 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6847 Type *tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6848
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6849 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6850 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6851 e1 = e1->toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6852 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6853
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6854 tb = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6855 switch (tb->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6856 { case Tclass:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6857 { TypeClass *tc = (TypeClass *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6858 ClassDeclaration *cd = tc->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6859
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6860 if (cd->isCOMinterface())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6861 { /* Because COM classes are deleted by IUnknown.Release()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6862 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6863 error("cannot delete instance of COM interface %s", cd->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6864 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6865 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6866 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6867 case Tpointer:
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
6868 tb = ((TypePointer *)tb)->next->toBasetype();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6869 if (tb->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6870 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6871 TypeStruct *ts = (TypeStruct *)tb;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6872 StructDeclaration *sd = ts->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6873 FuncDeclaration *f = sd->aggDelete;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6874
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6875 if (f)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6876 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6877 Type *tpv = Type::tvoid->pointerTo();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6878
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6879 Expression *e = e1->castTo(sc, tpv);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6880 Expression *ec = new VarExp(loc, f);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6881 e = new CallExp(loc, ec, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6882 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6883 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6884 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6885 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6886
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6887 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6888 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6889
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6890 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6891 if (e1->op == TOKindex)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6892 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6893 IndexExp *ae = (IndexExp *)(e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6894 Type *tb1 = ae->e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6895 if (tb1->ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6896 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6897 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6898 error("cannot delete type %s", e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6899 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6900 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6901
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6902 if (e1->op == TOKindex)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6903 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6904 IndexExp *ae = (IndexExp *)(e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6905 Type *tb1 = ae->e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6906 if (tb1->ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6907 { if (!global.params.useDeprecated)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6908 error("delete aa[key] deprecated, use aa.remove(key)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6910 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6911
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6912 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6913 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6914
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6915 int DeleteExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6916 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6917 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6918 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6919
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6920 Expression *DeleteExp::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6921 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6922 error("delete does not give a boolean result");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6923 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6924 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6925
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6926 void DeleteExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6927 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6928 buf->writestring("delete ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6929 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6930 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6931
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6932 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6933
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6934 CastExp::CastExp(Loc loc, Expression *e, Type *t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6935 : UnaExp(loc, TOKcast, sizeof(CastExp), e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6936 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6937 to = t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6938 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6939
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6940 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6941 /* For cast(const) and cast(immutable)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6942 */
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6943 CastExp::CastExp(Loc loc, Expression *e, unsigned mod)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6944 : UnaExp(loc, TOKcast, sizeof(CastExp), e)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6945 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6946 to = NULL;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6947 this->mod = mod;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6948 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6949 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
6950
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6951 Expression *CastExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6952 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6953 return new CastExp(loc, e1->syntaxCopy(), to->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6954 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6956
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6957 Expression *CastExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6958 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6959 BinExp *b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6960 UnaExp *u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6961
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6962 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6963 printf("CastExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6964 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6965
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6966 //static int x; assert(++x < 10);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6967
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6968 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6969 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6970 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6971 if (e1->type) // if not a tuple
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6972 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6973 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6974 to = to->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6975
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6976 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6977 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6978 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6979 return e->implicitCastTo(sc, to);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6980 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6981
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6982 Type *tob = to->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6983 if (tob->ty == Tstruct &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6984 !tob->equals(e1->type->toBasetype()) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6985 ((TypeStruct *)to)->sym->search(0, Id::call, 0)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6986 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6987 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6988 /* Look to replace:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6989 * cast(S)t
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6990 * with:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6991 * S(t)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6992 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6993
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6994 // Rewrite as to.call(e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6995 e = new TypeExp(loc, to);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6996 e = new DotIdExp(loc, e, Id::call);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6997 e = new CallExp(loc, e, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6998 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
6999 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7000 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7001 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7002 e = e1->castTo(sc, to);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7003 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7004 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7005
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7006 int CastExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7007 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7008 /* if not:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7009 * cast(void)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7010 * cast(classtype)func()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7011 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7012 if (!to->equals(Type::tvoid) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7013 !(to->ty == Tclass && e1->op == TOKcall && e1->type->ty == Tclass))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7014 return Expression::checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7015 return 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7016 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7017
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7018 void CastExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7019 { Type *tb = type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7020 if (tb->ty == Tarray && e1->op == TOKvar &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7021 e1->type->toBasetype()->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7022 { VarExp *ve = (VarExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7023 VarDeclaration *v = ve->var->isVarDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7024 if (v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7025 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7026 if (!v->isDataseg() && !v->isParameter())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7027 error("escaping reference to local %s", v->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7028 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7029 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7030 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7031
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7032 void CastExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7033 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7034 buf->writestring("cast(");
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7035 #if DMDV1
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7036 to->toCBuffer(buf, NULL, hgs);
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7037 #else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7038 if (to)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7039 to->toCBuffer(buf, NULL, hgs);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7040 else
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7041 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7042 switch (mod)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7043 { case 0:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7044 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7045 case MODconst:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7046 buf->writestring(Token::tochars[TOKconst]);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7047 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7048 case MODinvariant:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7049 buf->writestring(Token::tochars[TOKimmutable]);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7050 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7051 case MODshared:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7052 buf->writestring(Token::tochars[TOKshared]);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7053 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7054 case MODshared | MODconst:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7055 buf->writestring(Token::tochars[TOKshared]);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7056 buf->writeByte(' ');
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7057 buf->writestring(Token::tochars[TOKconst]);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7058 break;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7059 default:
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7060 assert(0);
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7061 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7062 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7063 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7064 buf->writeByte(')');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7065 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7066 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7067
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7068
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7069 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7070
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7071 SliceExp::SliceExp(Loc loc, Expression *e1, Expression *lwr, Expression *upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7072 : UnaExp(loc, TOKslice, sizeof(SliceExp), e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7073 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7074 this->upr = upr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7075 this->lwr = lwr;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7076 lengthVar = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7077 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7078
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7079 Expression *SliceExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7080 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7081 Expression *lwr = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7082 if (this->lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7083 lwr = this->lwr->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7084
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7085 Expression *upr = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7086 if (this->upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7087 upr = this->upr->syntaxCopy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7088
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7089 return new SliceExp(loc, e1->syntaxCopy(), lwr, upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7090 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7091
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7092 Expression *SliceExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7093 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7094 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7095 //FuncDeclaration *fd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7096 ScopeDsymbol *sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7097
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7098 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7099 printf("SliceExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7100 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7101 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7102 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7104 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7105 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7107 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7108
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7109 Type *t = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7110 if (t->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7111 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7112 if (!lwr || !upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7113 error("need upper and lower bound to slice pointer");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7114 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7115 else if (t->ty == Tarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7116 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7117 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7118 else if (t->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7119 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7120 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7121 else if (t->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7122 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7123 ad = ((TypeClass *)t)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7124 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7125 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7126 else if (t->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7127 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7128 ad = ((TypeStruct *)t)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7129
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7130 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7131 if (search_function(ad, Id::slice))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7133 // Rewrite as e1.slice(lwr, upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7134 e = new DotIdExp(loc, e1, Id::slice);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7135
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7136 if (lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7138 assert(upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7139 e = new CallExp(loc, e, lwr, upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7140 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7141 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7142 { assert(!upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7143 e = new CallExp(loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7144 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7145 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7146 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7147 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7148 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7149 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7150 else if (t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7151 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7152 if (!lwr && !upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7153 return e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7154 if (!lwr || !upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7155 { error("need upper and lower bound to slice tuple");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7156 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7157 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7158 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7159 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7160 goto Lerror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7161
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7162 if (t->ty == Tsarray || t->ty == Tarray || t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7163 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7164 sym = new ArrayScopeSymbol(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7165 sym->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7166 sym->parent = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7167 sc = sc->push(sym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7168 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7169
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7170 if (lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7171 { lwr = lwr->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7172 lwr = resolveProperties(sc, lwr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7173 lwr = lwr->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7174 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7175 if (upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7176 { upr = upr->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7177 upr = resolveProperties(sc, upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7178 upr = upr->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7179 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7180
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7181 if (t->ty == Tsarray || t->ty == Tarray || t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7182 sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7183
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7184 if (t->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7185 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7186 lwr = lwr->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7187 upr = upr->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7188 uinteger_t i1 = lwr->toUInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7189 uinteger_t i2 = upr->toUInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7190
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7191 size_t length;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7192 TupleExp *te;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7193 TypeTuple *tup;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7194
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7195 if (e1->op == TOKtuple) // slicing an expression tuple
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7196 { te = (TupleExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7197 length = te->exps->dim;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7198 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7199 else if (e1->op == TOKtype) // slicing a type tuple
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7200 { tup = (TypeTuple *)t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7201 length = Argument::dim(tup->arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7202 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7203 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7204 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7205
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7206 if (i1 <= i2 && i2 <= length)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7207 { size_t j1 = (size_t) i1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7208 size_t j2 = (size_t) i2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7210 if (e1->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7211 { Expressions *exps = new Expressions;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7212 exps->setDim(j2 - j1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7213 for (size_t i = 0; i < j2 - j1; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7214 { Expression *e = (Expression *)te->exps->data[j1 + i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7215 exps->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7216 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7217 e = new TupleExp(loc, exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7218 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7219 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7220 { Arguments *args = new Arguments;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7221 args->reserve(j2 - j1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7222 for (size_t i = j1; i < j2; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7223 { Argument *arg = Argument::getNth(tup->arguments, i);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7224 args->push(arg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7225 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7226 e = new TypeExp(e1->loc, new TypeTuple(args));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7227 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7228 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7229 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7230 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7231 {
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
7232 error("string slice [%llu .. %llu] is out of bounds", i1, i2);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7233 e = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7235 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7236 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7237
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7238 type = t->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7239 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7240
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7241 Lerror:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7242 char *s;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7243 if (t->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7244 s = e1->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7245 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7246 s = t->toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7247 error("%s cannot be sliced with []", s);
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
7248 e = new IntegerExp(0);
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7249 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7250 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7251
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7252 void SliceExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7253 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7254 e1->checkEscape();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7255 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7256
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7257 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7258 int SliceExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7259 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7260 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7261 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7262 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7263
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7264 Expression *SliceExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7265 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7266 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7268
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7269 Expression *SliceExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7270 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7271 error("slice expression %s is not a modifiable lvalue", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7272 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7273 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7275 void SliceExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7276 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7277 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7278 buf->writeByte('[');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7279 if (upr || lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7280 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7281 if (lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7282 expToCBuffer(buf, hgs, lwr, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7283 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7284 buf->writeByte('0');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7285 buf->writestring("..");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7286 if (upr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7287 expToCBuffer(buf, hgs, upr, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7288 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7289 buf->writestring("length"); // BUG: should be array.length
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7291 buf->writeByte(']');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7292 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7293
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7294 /********************** ArrayLength **************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7295
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7296 ArrayLengthExp::ArrayLengthExp(Loc loc, Expression *e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7297 : UnaExp(loc, TOKarraylength, sizeof(ArrayLengthExp), e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7298 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7299 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7300
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7301 Expression *ArrayLengthExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7302 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7303
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7304 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7305 printf("ArrayLengthExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7306 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7307 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7308 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7309 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7310 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7311
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7312 type = Type::tsize_t;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7313 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7314 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7315 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7317 void ArrayLengthExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7318 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7319 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7320 buf->writestring(".length");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7321 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7322
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7323 /*********************** ArrayExp *************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7325 // e1 [ i1, i2, i3, ... ]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7326
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7327 ArrayExp::ArrayExp(Loc loc, Expression *e1, Expressions *args)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7328 : UnaExp(loc, TOKarray, sizeof(ArrayExp), e1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7329 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7330 arguments = args;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7331 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7332
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7333 Expression *ArrayExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7334 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7335 return new ArrayExp(loc, e1->syntaxCopy(), arraySyntaxCopy(arguments));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7336 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7337
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7338 Expression *ArrayExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7339 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7340 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7341
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7342 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7343 printf("ArrayExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7344 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7345 UnaExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7346 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7347
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7348 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7349 if (t1->ty != Tclass && t1->ty != Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7350 { // Convert to IndexExp
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7351 if (arguments->dim != 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7352 error("only one index allowed to index %s", t1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7353 e = new IndexExp(loc, e1, (Expression *)arguments->data[0]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7354 return e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7357 // Run semantic() on each argument
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7358 for (size_t i = 0; i < arguments->dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7359 { e = (Expression *)arguments->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7360
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7361 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7362 if (!e->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7363 error("%s has no value", e->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7364 arguments->data[i] = (void *)e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7365 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7367 expandTuples(arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7368 assert(arguments && arguments->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7369
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7370 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7371 if (!e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7372 { error("no [] operator overload for type %s", e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7373 e = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7374 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7375 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7376 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7377
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7378 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7379 int ArrayExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7380 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7381 if (type && type->toBasetype()->ty == Tvoid)
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7382 return 0;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7383 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7384 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7385 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7386
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7387 Expression *ArrayExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7388 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7389 if (type && type->toBasetype()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7390 error("voids have no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7391 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7392 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7393
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7394
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7395 void ArrayExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7396 { int i;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7397
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7398 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7399 buf->writeByte('[');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7400 argsToCBuffer(buf, arguments, hgs);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7401 buf->writeByte(']');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7402 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7403
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7404 /************************* DotExp ***********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7405
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7406 DotExp::DotExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7407 : BinExp(loc, TOKdotexp, sizeof(DotExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7408 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7409 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7410
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7411 Expression *DotExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7412 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7413 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7414 printf("DotExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7415 if (type) printf("\ttype = %s\n", type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7416 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7417 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7418 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7419 if (e2->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7420 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7421 ScopeExp *se = (ScopeExp *)e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7422 TemplateDeclaration *td = se->sds->isTemplateDeclaration();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7423 if (td)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7424 { Expression *e = new DotTemplateExp(loc, e1, td);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7425 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7426 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7427 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7428 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7429 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7430 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7431 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7432 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7433
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7434
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7435 /************************* CommaExp ***********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7436
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7437 CommaExp::CommaExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7438 : BinExp(loc, TOKcomma, sizeof(CommaExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7439 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7440 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7441
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7442 Expression *CommaExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7443 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7444 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7445 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7446 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7447 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7448 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7449 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7450
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7451 void CommaExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7452 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7453 e2->checkEscape();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7454 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7455
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7456 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7457 int CommaExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7458 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7459 return e2->isLvalue();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7460 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7461 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7462
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7463 Expression *CommaExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7464 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7465 e2 = e2->toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7466 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7467 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7468
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7469 Expression *CommaExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7470 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7471 e2 = e2->modifiableLvalue(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7472 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7473 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7474
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7475 int CommaExp::isBool(int result)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7476 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7477 return e2->isBool(result);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7478 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7479
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7480 int CommaExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7482 if (flag == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7483 return e1->checkSideEffect(2) || e2->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7484 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7485 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7486 // Don't check e1 until we cast(void) the a,b code generation
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7487 return e2->checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7488 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7489 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7490
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7491 /************************** IndexExp **********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7492
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7493 // e1 [ e2 ]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7494
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7495 IndexExp::IndexExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7496 : BinExp(loc, TOKindex, sizeof(IndexExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7497 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7498 //printf("IndexExp::IndexExp('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7499 lengthVar = NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7500 modifiable = 0; // assume it is an rvalue
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7501 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7502
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7503 Expression *IndexExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7504 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7505 BinExp *b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7506 UnaExp *u;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7507 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7508 ScopeDsymbol *sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7509
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7510 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7511 printf("IndexExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7512 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7513 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7514 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7515 if (!e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7516 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7517 assert(e1->type); // semantic() should already be run on it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7518 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7519
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7520 // Note that unlike C we do not implement the int[ptr]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7521
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7522 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7523
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7524 if (t1->ty == Tsarray || t1->ty == Tarray || t1->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7525 { // Create scope for 'length' variable
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7526 sym = new ArrayScopeSymbol(this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7527 sym->loc = loc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7528 sym->parent = sc->scopesym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7529 sc = sc->push(sym);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7530 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7531
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7532 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7533 if (!e2->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7534 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7535 error("%s has no value", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7536 e2->type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7537 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7538 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7539
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7540 if (t1->ty == Tsarray || t1->ty == Tarray || t1->ty == Ttuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7541 sc = sc->pop();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7542
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7543 switch (t1->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7544 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7545 case Tpointer:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7546 case Tarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7547 e2 = e2->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7548 e->type = t1->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7549 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7550
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7551 case Tsarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7552 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7553 e2 = e2->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7554
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7555 TypeSArray *tsa = (TypeSArray *)t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7556
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7557 #if 0 // Don't do now, because it might be short-circuit evaluated
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7558 // Do compile time array bounds checking if possible
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7559 e2 = e2->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7560 if (e2->op == TOKint64)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7561 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7562 integer_t index = e2->toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7563 integer_t length = tsa->dim->toInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7564 if (index < 0 || index >= length)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7565 error("array index [%lld] is outside array bounds [0 .. %lld]",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7566 index, length);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7567 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7568 #endif
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7569 e->type = t1->nextOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7570 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7571 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7572
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7573 case Taarray:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7574 { TypeAArray *taa = (TypeAArray *)t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7575
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7576 e2 = e2->implicitCastTo(sc, taa->index); // type checking
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7577 e2 = e2->implicitCastTo(sc, taa->key); // actual argument type
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7578 type = taa->next;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7579 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7580 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7581
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7582 case Ttuple:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7583 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7584 e2 = e2->implicitCastTo(sc, Type::tsize_t);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7585 e2 = e2->optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7586 uinteger_t index = e2->toUInteger();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7587 size_t length;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7588 TupleExp *te;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7589 TypeTuple *tup;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7590
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7591 if (e1->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7592 { te = (TupleExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7593 length = te->exps->dim;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7594 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7595 else if (e1->op == TOKtype)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7596 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7597 tup = (TypeTuple *)t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7598 length = Argument::dim(tup->arguments);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7599 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7600 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7601 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7602
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7603 if (index < length)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7604 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7605
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7606 if (e1->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7607 e = (Expression *)te->exps->data[(size_t)index];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7608 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7609 e = new TypeExp(e1->loc, Argument::getNth(tup->arguments, (size_t)index)->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7610 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7611 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7612 {
305
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
7613 error("array index [%llu] is outside array bounds [0 .. %"PRIuSIZE"]",
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
7614 index, length);
2b72433d5c8c [svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support.
lindquist
parents: 285
diff changeset
7615 e = e1;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7616 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7617 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7618 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7619
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7620 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7621 error("%s must be an array or pointer type, not %s",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7622 e1->toChars(), e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7623 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7624 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7625 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7626 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7627 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7628
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7629 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7630 int IndexExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7631 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7632 return 1;
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7633 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7634 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
7635
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7636 Expression *IndexExp::toLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7637 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7638 // if (type && type->toBasetype()->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7639 // error("voids have no value");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7640 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7641 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7642
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7643 Expression *IndexExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7644 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7645 //printf("IndexExp::modifiableLvalue(%s)\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7646 modifiable = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7647 if (e1->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7648 error("string literals are immutable");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7649 if (e1->type->toBasetype()->ty == Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7650 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7651 return toLvalue(sc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7652 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7653
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7654 void IndexExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7655 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7656 expToCBuffer(buf, hgs, e1, PREC_primary);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7657 buf->writeByte('[');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7658 expToCBuffer(buf, hgs, e2, PREC_assign);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7659 buf->writeByte(']');
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7660 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7661
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7662
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7663 /************************* PostExp ***********************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7664
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7665 PostExp::PostExp(enum TOK op, Loc loc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7666 : BinExp(loc, op, sizeof(PostExp), e,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7667 new IntegerExp(loc, 1, Type::tint32))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7668 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7669 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7670
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7671 Expression *PostExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7672 { Expression *e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7673
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7674 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7675 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7676 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7677 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7678
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7679 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7680 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7681 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7682
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7683 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7684 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7685 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7686 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7687 if (e1->type->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7688 e = scaleFactor(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7689 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7690 e2 = e2->castTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7691 e->type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7692 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7693 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7694 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7695
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7696 void PostExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7697 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7698 expToCBuffer(buf, hgs, e1, precedence[op]);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7699 buf->writestring((op == TOKplusplus) ? (char *)"++" : (char *)"--");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7700 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7701
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7702 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7703
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7704 /* Can be TOKconstruct too */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7705
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7706 AssignExp::AssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7707 : BinExp(loc, TOKassign, sizeof(AssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7708 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7709 ismemset = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7710 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7711
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7712 Expression *AssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7713 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7714 Expression *e1old = e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7715
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7716 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7717 printf("AssignExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7718 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7719 //printf("e1->op = %d, '%s'\n", e1->op, Token::toChars(e1->op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7720
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7721 /* Look for operator overloading of a[i]=value.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7722 * Do it before semantic() otherwise the a[i] will have been
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7723 * converted to a.opIndex() already.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7724 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7725 if (e1->op == TOKarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7726 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7727 ArrayExp *ae = (ArrayExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7728 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7729 Identifier *id = Id::index;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7730
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7731 ae->e1 = ae->e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7732 t1 = ae->e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7733 if (t1->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7734 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7735 ad = ((TypeStruct *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7736 goto L1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7737 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7738 else if (t1->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7739 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7740 ad = ((TypeClass *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7741 L1:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7742 // Rewrite (a[i] = value) to (a.opIndexAssign(value, i))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7743 if (search_function(ad, Id::indexass))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7744 { Expression *e = new DotIdExp(loc, ae->e1, Id::indexass);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7745 Expressions *a = (Expressions *)ae->arguments->copy();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7746
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7747 a->insert(0, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7748 e = new CallExp(loc, e, a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7749 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7750 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7751 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7752 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7753 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7754 // Rewrite (a[i] = value) to (a.opIndex(i, value))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7755 if (search_function(ad, id))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7756 { Expression *e = new DotIdExp(loc, ae->e1, id);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7757
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7758 if (1 || !global.params.useDeprecated)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7759 error("operator [] assignment overload with opIndex(i, value) illegal, use opIndexAssign(value, i)");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7760
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7761 e = new CallExp(loc, e, (Expression *)ae->arguments->data[0], e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7762 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7763 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7764 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7765 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7766 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7767 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7768 /* Look for operator overloading of a[i..j]=value.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7769 * Do it before semantic() otherwise the a[i..j] will have been
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7770 * converted to a.opSlice() already.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7771 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7772 if (e1->op == TOKslice)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7773 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7774 SliceExp *ae = (SliceExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7775 AggregateDeclaration *ad;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7776 Identifier *id = Id::index;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7777
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7778 ae->e1 = ae->e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7779 ae->e1 = resolveProperties(sc, ae->e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7780 t1 = ae->e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7781 if (t1->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7782 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7783 ad = ((TypeStruct *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7784 goto L2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7785 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7786 else if (t1->ty == Tclass)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7787 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7788 ad = ((TypeClass *)t1)->sym;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7789 L2:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7790 // Rewrite (a[i..j] = value) to (a.opIndexAssign(value, i, j))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7791 if (search_function(ad, Id::sliceass))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7792 { Expression *e = new DotIdExp(loc, ae->e1, Id::sliceass);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7793 Expressions *a = new Expressions();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7794
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7795 a->push(e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7796 if (ae->lwr)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7797 { a->push(ae->lwr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7798 assert(ae->upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7799 a->push(ae->upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7800 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7801 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7802 assert(!ae->upr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7803 e = new CallExp(loc, e, a);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7804 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7805 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7806 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7807 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7808 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7809
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7810 BinExp::semantic(sc);
717
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7811
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7812 if (e1->op == TOKdottd)
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7813 { // Rewrite a.b=e2, when b is a template, as a.b(e2)
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7814 Expression *e = new CallExp(loc, e1, e2);
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7815 e = e->semantic(sc);
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7816 return e;
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7817 }
a26b0c5d5942 Merged DMD 1.036.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 664
diff changeset
7818
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7819 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7820 assert(e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7821
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7822 /* Rewrite tuple assignment as a tuple of assignments.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7823 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7824 if (e1->op == TOKtuple && e2->op == TOKtuple)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7825 { TupleExp *tup1 = (TupleExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7826 TupleExp *tup2 = (TupleExp *)e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7827 size_t dim = tup1->exps->dim;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7828 if (dim != tup2->exps->dim)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7829 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7830 error("mismatched tuple lengths, %d and %d", (int)dim, (int)tup2->exps->dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7831 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7832 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7833 { Expressions *exps = new Expressions;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7834 exps->setDim(dim);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7835
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7836 for (int i = 0; i < dim; i++)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7837 { Expression *ex1 = (Expression *)tup1->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7838 Expression *ex2 = (Expression *)tup2->exps->data[i];
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7839 exps->data[i] = (void *) new AssignExp(loc, ex1, ex2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7840 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7841 Expression *e = new TupleExp(loc, exps);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7842 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7843 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7844 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7845 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7846
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7847 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7848
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7849 if (t1->ty == Tfunction)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7850 { // Rewrite f=value to f(value)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7851 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7852
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7853 e = new CallExp(loc, e1, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7854 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7855 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7856 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7857
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7858 /* If it is an assignment from a 'foreign' type,
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7859 * check for operator overloading.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7860 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7861 if (t1->ty == Tclass || t1->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7862 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7863 if (!e2->type->implicitConvTo(e1->type))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7864 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7865 Expression *e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7866 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7867 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7868 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7869 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7870
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7871 e2->rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7872
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7873 if (e1->op == TOKarraylength)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7874 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7875 // e1 is not an lvalue, but we let code generator handle it
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7876 ArrayLengthExp *ale = (ArrayLengthExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7877
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7878 ale->e1 = ale->e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7879 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7880 else if (e1->op == TOKslice)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7881 ;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7882 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7883 { // Try to do a decent error message with the expression
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7884 // before it got constant folded
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7885 e1 = e1->modifiableLvalue(sc, e1old);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7886 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7888 if (e1->op == TOKslice &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7889 t1->nextOf() &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7890 e2->implicitConvTo(t1->nextOf())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7891 // !(t1->nextOf()->equals(e2->type->nextOf()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7892 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7893 { // memset
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7894 ismemset = 1; // make it easy for back end to tell what this is
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7895 e2 = e2->implicitCastTo(sc, t1->next);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7896 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7897 else if (t1->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7898 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7899 error("cannot assign to static array %s", e1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7900 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7901 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7902 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7903 e2 = e2->implicitCastTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7904 }
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7905
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7906 /* Look for array operations
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7907 */
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7908 if (e1->op == TOKslice && !ismemset &&
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7909 (e2->op == TOKadd || e2->op == TOKmin ||
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7910 e2->op == TOKmul || e2->op == TOKdiv ||
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7911 e2->op == TOKmod || e2->op == TOKxor ||
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7912 e2->op == TOKand || e2->op == TOKor ||
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7913 e2->op == TOKtilde || e2->op == TOKneg))
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7914 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7915 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7916 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7917 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7918
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7919 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7920 assert(type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7921 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7922 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7923
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7924 Expression *AssignExp::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7925 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7926 // Things like:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7927 // if (a = b) ...
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7928 // are usually mistakes.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7929
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7930 error("'=' does not give a boolean result");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7931 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7932 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7933
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7934 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7935
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7936 AddAssignExp::AddAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7937 : BinExp(loc, TOKaddass, sizeof(AddAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7938 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7939 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7940
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7941 Expression *AddAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7942 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7943
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7944 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7945 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7946
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7947 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7948 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7949
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7950 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7951 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7952 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7953
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7954 Type *tb1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7955 Type *tb2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7956
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7957 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7958 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7959 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7960 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7961 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7962 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7963 else
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7964 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7965 e1 = e1->modifiableLvalue(sc, e1);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7966 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7967
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7968 if ((tb1->ty == Tarray || tb1->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7969 (tb2->ty == Tarray || tb2->ty == Tsarray) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7970 tb1->nextOf()->equals(tb2->nextOf())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7971 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7972 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7973 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7974 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7975 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7976 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7977 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7978 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7979 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7980 if (tb1->ty == Tpointer && tb2->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7981 e = scaleFactor(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7982 else if (tb1->ty == Tbit || tb1->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7983 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7984 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7985 // Need to rethink this
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7986 if (e1->op != TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7987 { // Rewrite e1+=e2 to (v=&e1),*v=*v+e2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7988 VarDeclaration *v;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7989 Expression *ea;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7990 Expression *ex;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7991
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
7992 Identifier *id = Lexer::uniqueId("__name");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7993
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7994 v = new VarDeclaration(loc, tb1->pointerTo(), id, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7995 v->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7996 if (!sc->insert(v))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7997 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7998 v->parent = sc->func;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
7999
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8000 ea = new AddrExp(loc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8001 ea = new AssignExp(loc, new VarExp(loc, v), ea);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8002
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8003 ex = new VarExp(loc, v);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8004 ex = new PtrExp(loc, ex);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8005 e = new AddExp(loc, ex, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8006 e = new CastExp(loc, e, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8007 e = new AssignExp(loc, ex->syntaxCopy(), e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8008
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8009 e = new CommaExp(loc, ea, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8010 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8011 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8012 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8013 { // Rewrite e1+=e2 to e1=e1+e2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8014 // BUG: doesn't account for side effects in e1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8015 // BUG: other assignment operators for bits aren't handled at all
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8016 e = new AddExp(loc, e1, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8017 e = new CastExp(loc, e, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8018 e = new AssignExp(loc, e1->syntaxCopy(), e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8019 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8020 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8021 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8022 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8023 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8024 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8025 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8026 e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8027 e2->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8028 if (type->isreal() || type->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8029 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8030 assert(global.errors || e2->type->isfloating());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8031 e2 = e2->castTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8032 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8033 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8034 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8035 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8036 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8037 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8038
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8039 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8040
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8041 MinAssignExp::MinAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8042 : BinExp(loc, TOKminass, sizeof(MinAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8043 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8044 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8045
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8046 Expression *MinAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8047 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8048
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8049 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8050 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8051
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8052 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8053 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8054
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8055 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8056 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8057 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8058
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8059 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8060 { // T[] -= ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8061 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8062 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8063 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8064 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8065
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8066 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8067 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8068 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8069 if (e1->type->ty == Tpointer && e2->type->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8070 e = scaleFactor(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8071 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8072 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8073 e1 = e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8074 e2 = e2->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8075 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8076 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8077 if (type->isreal() || type->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8078 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8079 assert(e2->type->isfloating());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8080 e2 = e2->castTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8081 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8082 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8083 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8084 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8085 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8086
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8087 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8088
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8089 CatAssignExp::CatAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8090 : BinExp(loc, TOKcatass, sizeof(CatAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8091 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8092 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8093
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8094 Expression *CatAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8095 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8096
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8097 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8098 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8099
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8100 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8101 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8102 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8103
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8104 if (e1->op == TOKslice)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8105 { SliceExp *se = (SliceExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8107 if (se->e1->type->toBasetype()->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8108 error("cannot append to static array %s", se->e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8109 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8110
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8111 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8112
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8113 Type *tb1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8114 Type *tb2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8115
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8116 e2->rvalue();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8117
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8118 if ((tb1->ty == Tarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8119 (tb2->ty == Tarray || tb2->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8120 e2->implicitConvTo(e1->type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8121 //e1->type->next->equals(e2->type->next)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8122 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8123 { // Append array
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8124 e2 = e2->castTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8125 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8126 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8127 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8128 else if ((tb1->ty == Tarray) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8129 e2->implicitConvTo(tb1->nextOf())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8130 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8131 { // Append element
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8132 e2 = e2->castTo(sc, tb1->nextOf());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8133 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8134 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8135 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8136 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8137 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8138 error("cannot append type %s to type %s", tb2->toChars(), tb1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8139 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8140 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8141 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8142 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8143 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8144
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8145 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8146
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8147 MulAssignExp::MulAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8148 : BinExp(loc, TOKmulass, sizeof(MulAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8149 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8150 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8151
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8152 Expression *MulAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8153 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8154
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8155 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8156 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8157
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8158 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8159 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8160 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8161
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8162 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8163 { // T[] -= ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8164 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8165 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8166 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8167 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8168
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8169 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8170 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8171 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8172 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8173 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8174 e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8175 e2->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8176 if (e2->type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8177 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8178 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8179
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8180 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8181 t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8182 if (t1->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8183 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8184 if (t2->isimaginary() || t2->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8185 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8186 e2 = e2->castTo(sc, t1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8187 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8188 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8189 else if (t1->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8190 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8191 if (t2->isimaginary() || t2->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8192 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8193 switch (t1->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8194 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8195 case Timaginary32: t2 = Type::tfloat32; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8196 case Timaginary64: t2 = Type::tfloat64; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8197 case Timaginary80: t2 = Type::tfloat80; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8198 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8199 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8200 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8201 e2 = e2->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8202 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8203 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8204 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8205 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8206 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8207
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8208 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8209
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8210 DivAssignExp::DivAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8211 : BinExp(loc, TOKdivass, sizeof(DivAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8212 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8213 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8214
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8215 Expression *DivAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8216 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8217
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8218 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8219 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8220
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8221 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8222 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8223 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8224
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8225 if (e1->op == TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8226 { // T[] -= ...
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8227 typeCombine(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8228 type = e1->type;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8229 return arrayOp(sc);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8230 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8231
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8232 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8233 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8234 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8235 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8236 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8237 e1->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8238 e2->checkArithmetic();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8239 if (e2->type->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8240 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8241 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8242
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8243 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8244 if (t1->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8245 { // x/iv = i(-x/v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8246 // Therefore, the result is 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8247 e2 = new CommaExp(loc, e2, new RealExp(loc, 0, t1));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8248 e2->type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8249 e = new AssignExp(loc, e1, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8250 e->type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8251 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8252 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8253 else if (t1->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8254 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8255
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8256 switch (t1->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8257 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8258 case Timaginary32: t2 = Type::tfloat32; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8259 case Timaginary64: t2 = Type::tfloat64; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8260 case Timaginary80: t2 = Type::tfloat80; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8261 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8262 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8263 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8264 e2 = e2->castTo(sc, t2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8265 e = new AssignExp(loc, e1, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8266 e->type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8267 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8268 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8269 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8270 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8272
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8273 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8274
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8275 ModAssignExp::ModAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8276 : BinExp(loc, TOKmodass, sizeof(ModAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8277 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8278 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8279
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8280 Expression *ModAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8281 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8282 return commonSemanticAssign(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8283 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8284
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8285 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8286
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8287 ShlAssignExp::ShlAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8288 : BinExp(loc, TOKshlass, sizeof(ShlAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8289 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8290 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8291
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8292 Expression *ShlAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8293 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8294
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8295 //printf("ShlAssignExp::semantic()\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8296 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8297 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8298
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8299 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8300 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8301 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8302
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8303 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8304 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8305 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8306 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8307 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8308 e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8309 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8310 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8311 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8312 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8313 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8314
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8315 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8316
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8317 ShrAssignExp::ShrAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8318 : BinExp(loc, TOKshrass, sizeof(ShrAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8319 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8321
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8322 Expression *ShrAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8323 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8324
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8325 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8326 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8327
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8328 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8329 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8330 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8331
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8332 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8333 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8334 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8335 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8336 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8337 e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8338 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8339 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8340 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8341 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8342 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8343
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8344 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8345
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8346 UshrAssignExp::UshrAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8347 : BinExp(loc, TOKushrass, sizeof(UshrAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8348 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8349 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8350
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8351 Expression *UshrAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8352 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8353
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8354 BinExp::semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8355 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8356
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8357 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8358 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8359 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8360
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8361 e1 = e1->modifiableLvalue(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8362 e1->checkScalar();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8363 e1->checkNoBool();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8364 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8365 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8366 e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8367 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8368 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8369 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8370 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8371 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8372
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8373 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8374
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8375 AndAssignExp::AndAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8376 : BinExp(loc, TOKandass, sizeof(AndAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8377 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8378 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8379
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8380 Expression *AndAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8381 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8382 return commonSemanticAssignIntegral(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8383 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8384
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8385 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8386
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8387 OrAssignExp::OrAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8388 : BinExp(loc, TOKorass, sizeof(OrAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8389 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8390 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8391
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8392 Expression *OrAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8393 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8394 return commonSemanticAssignIntegral(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8395 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8396
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8397 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8398
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8399 XorAssignExp::XorAssignExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8400 : BinExp(loc, TOKxorass, sizeof(XorAssignExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8401 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8402 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8403
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8404 Expression *XorAssignExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8405 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8406 return commonSemanticAssignIntegral(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8407 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8408
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8409 /************************* AddExp *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8410
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8411 AddExp::AddExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8412 : BinExp(loc, TOKadd, sizeof(AddExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8413 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8414 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8415
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8416 Expression *AddExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8417 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8418
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8419 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8420 printf("AddExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8421 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8422 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8423 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8424 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8425
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8426 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8427 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8428 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8429
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8430 Type *tb1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8431 Type *tb2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8432
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8433 if ((tb1->ty == Tarray || tb1->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8434 (tb2->ty == Tarray || tb2->ty == Tsarray) &&
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8435 tb1->nextOf()->equals(tb2->nextOf())
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8436 )
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8438 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8439 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8440 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8441 else if (tb1->ty == Tpointer && e2->type->isintegral() ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8442 tb2->ty == Tpointer && e1->type->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8443 e = scaleFactor(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8444 else if (tb1->ty == Tpointer && tb2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8445 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8446 incompatibleTypes();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8447 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8448 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8449 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8450 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8451 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8452 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8453 if ((e1->type->isreal() && e2->type->isimaginary()) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8454 (e1->type->isimaginary() && e2->type->isreal()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8455 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8456 switch (type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8457 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8458 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8459 case Timaginary32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8460 type = Type::tcomplex32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8461 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8462
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8463 case Tfloat64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8464 case Timaginary64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8465 type = Type::tcomplex64;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8466 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8467
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8468 case Tfloat80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8469 case Timaginary80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8470 type = Type::tcomplex80;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8471 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8472
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8473 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8474 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8475 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8476 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8477 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8478 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8479 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8480 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8481 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8482 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8483
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8484 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8485
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8486 MinExp::MinExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8487 : BinExp(loc, TOKmin, sizeof(MinExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8488 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8489 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8490
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8491 Expression *MinExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8492 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8493 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8494 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8495
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8496 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8497 printf("MinExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8498 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8499 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8500 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8501
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8502 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8503
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8504 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8505 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8506 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8507
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8508 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8509 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8510 t2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8511 if (t1->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8512 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8513 if (t2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8514 { // Need to divide the result by the stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8515 // Replace (ptr - ptr) with (ptr - ptr) / stride
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8516 d_int64 stride;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8517 Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8518
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8519 typeCombine(sc); // make sure pointer types are compatible
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8520 type = Type::tptrdiff_t;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8521 stride = t2->nextOf()->size();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8522 if (stride == 0)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8523 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8524 e = new IntegerExp(loc, 0, Type::tptrdiff_t);
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8525 }
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8526 else
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8527 {
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8528 e = new DivExp(loc, this, new IntegerExp(0, stride, Type::tptrdiff_t));
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8529 e->type = Type::tptrdiff_t;
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8530 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8531 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8532 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8533 else if (t2->isintegral())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8534 e = scaleFactor(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8535 else
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8536 { error("incompatible types for minus");
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8537 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8538 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8539 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8540 else if (t2->ty == Tpointer)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8541 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8542 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8543 error("can't subtract pointer from %s", e1->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8544 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8545 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8546 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8547 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8548 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8549 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8550 t2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8551 if ((t1->isreal() && t2->isimaginary()) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8552 (t1->isimaginary() && t2->isreal()))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8553 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8554 switch (type->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8555 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8556 case Tfloat32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8557 case Timaginary32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8558 type = Type::tcomplex32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8559 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8560
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8561 case Tfloat64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8562 case Timaginary64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8563 type = Type::tcomplex64;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8564 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8565
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8566 case Tfloat80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8567 case Timaginary80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8568 type = Type::tcomplex80;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8569 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8570
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8571 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8572 assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8574 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8575 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8576 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8577 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8578
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8579 /************************* CatExp *****************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8580
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8581 CatExp::CatExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8582 : BinExp(loc, TOKcat, sizeof(CatExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8583 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8584 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8585
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8586 Expression *CatExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8587 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8588
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8589 //printf("CatExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8590 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8591 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8592 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8593 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8594 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8595 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8596
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8597 Type *tb1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8598 Type *tb2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8599
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8600
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8601 /* BUG: Should handle things like:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8602 * char c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8603 * c ~ ' '
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8604 * ' ' ~ c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8605 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8606
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8607 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8608 e1->type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8609 e2->type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8610 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8611 if ((tb1->ty == Tsarray || tb1->ty == Tarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8612 e2->type->equals(tb1->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8613 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8614 type = tb1->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8615 if (tb2->ty == Tarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8616 { // Make e2 into [e2]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8617 e2 = new ArrayLiteralExp(e2->loc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8618 e2->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8619 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8620 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8621 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8622 else if ((tb2->ty == Tsarray || tb2->ty == Tarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8623 e1->type->equals(tb2->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8624 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8625 type = tb2->nextOf()->arrayOf();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8626 if (tb1->ty == Tarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8627 { // Make e1 into [e1]
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8628 e1 = new ArrayLiteralExp(e1->loc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8629 e1->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8630 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8631 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8632 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8633
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8634 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8635
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8636 if (type->toBasetype()->ty == Tsarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8637 type = type->toBasetype()->next->arrayOf();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8638 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8639 e1->type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8640 e2->type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8641 type->print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8642 print();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8643 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8644 if (e1->op == TOKstring && e2->op == TOKstring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8645 e = optimize(WANTvalue);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8646 else if (e1->type->equals(e2->type) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8647 (e1->type->toBasetype()->ty == Tarray ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8648 e1->type->toBasetype()->ty == Tsarray))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8649 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8650 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8651 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8652 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8653 {
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8654 //printf("(%s) ~ (%s)\n", e1->toChars(), e2->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8655 error("Can only concatenate arrays, not (%s ~ %s)",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8656 e1->type->toChars(), e2->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8657 type = Type::tint32;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8658 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8659 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8660 e->type = e->type->semantic(loc, sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8661 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8662 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8663 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8664 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8665
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8666 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8667
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8668 MulExp::MulExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8669 : BinExp(loc, TOKmul, sizeof(MulExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8670 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8671 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8672
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8673 Expression *MulExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8674 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8675
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8676 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8677 printf("MulExp::semantic() %s\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8678 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8679 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8680 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8681 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8682 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8683
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8684 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8685 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8686 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8687 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8688
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8689 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8690 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8691 { e1->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8692 e2->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8693 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8694 if (type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8695 { Type *t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8696 Type *t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8697
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8698 if (t1->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8699 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8700 type = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8701 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8702 else if (t2->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8703 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8704 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8705 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8706 else if (t1->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8707 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8708 if (t2->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8709 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8710
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8711 switch (t1->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8712 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8713 case Timaginary32: type = Type::tfloat32; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8714 case Timaginary64: type = Type::tfloat64; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8715 case Timaginary80: type = Type::tfloat80; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8716 default: assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8717 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8718
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8719 // iy * iv = -yv
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8720 e1->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8721 e2->type = type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8722 e = new NegExp(loc, this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8723 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8724 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8725 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8726 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8727 type = t2; // t2 is complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8728 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8729 else if (t2->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8730 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8731 type = t1; // t1 is complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8732 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8733 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8734 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8735 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8736
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8737 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8738
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8739 DivExp::DivExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8740 : BinExp(loc, TOKdiv, sizeof(DivExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8741 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8742 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8743
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8744 Expression *DivExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8745 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8746
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8747 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8748 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8749
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8750 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8751 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8752 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8753 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8754
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8755 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8756 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8757 { e1->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8758 e2->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8759 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8760 if (type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8761 { Type *t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8762 Type *t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8763
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8764 if (t1->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8765 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8766 type = t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8767 if (t2->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8768 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8769
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8770 // x/iv = i(-x/v)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8771 e2->type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8772 e = new NegExp(loc, this);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8773 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8774 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8775 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8776 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8777 else if (t2->isreal())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8778 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8779 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8780 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8781 else if (t1->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8782 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8783 if (t2->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8784 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8785 switch (t1->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8786 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8787 case Timaginary32: type = Type::tfloat32; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8788 case Timaginary64: type = Type::tfloat64; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8789 case Timaginary80: type = Type::tfloat80; break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8790 default: assert(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8791 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8792 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8793 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8794 type = t2; // t2 is complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8795 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8796 else if (t2->isimaginary())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8797 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8798 type = t1; // t1 is complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8799 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8800 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8801 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8802 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8803
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8804 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8805
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8806 ModExp::ModExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8807 : BinExp(loc, TOKmod, sizeof(ModExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8808 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8809 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8810
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8811 Expression *ModExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8812 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8813
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8814 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8815 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8816
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8817 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8818 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8819 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8820 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8821
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8822 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8823 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8824 { e1->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8825 e2->checkArithmetic();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8826 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8827 if (type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8828 { type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8829 if (e2->type->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8830 { error("cannot perform modulo complex arithmetic");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8831 return new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8832 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8833 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8834 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8835 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8836
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8837 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8838
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8839 ShlExp::ShlExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8840 : BinExp(loc, TOKshl, sizeof(ShlExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8841 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8842 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8843
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8844 Expression *ShlExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8845 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8846
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8847 //printf("ShlExp::semantic(), type = %p\n", type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8848 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8849 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8850 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8851 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8852 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8853 e1 = e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8854 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8855 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8856 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8857 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8858 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8859 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8860 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8861 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8862
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8863 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8864
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8865 ShrExp::ShrExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8866 : BinExp(loc, TOKshr, sizeof(ShrExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8867 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8868 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8869
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8870 Expression *ShrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8871 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8872
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8873 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8874 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8875 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8876 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8877 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8878 e1 = e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8879 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8880 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8881 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8882 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8883 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8884 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8885 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8886 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8887
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8888 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8889
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8890 UshrExp::UshrExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8891 : BinExp(loc, TOKushr, sizeof(UshrExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8892 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8893 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8894
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8895 Expression *UshrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8896 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8897
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8898 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8899 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8900 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8901 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8902 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8903 e1 = e1->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8904 e2 = e2->checkIntegral();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8905 e1 = e1->integralPromotions(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8906 //e2 = e2->castTo(sc, Type::tshiftcnt);
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
8907 e2 = e2->castTo(sc, e1->type); // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8908 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8909 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8910 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8911 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8912
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8913 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8914
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8915 AndExp::AndExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8916 : BinExp(loc, TOKand, sizeof(AndExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8917 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8918 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8919
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8920 Expression *AndExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8921 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8922
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8923 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8924 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8925 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8926 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8927 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8928 if (e1->type->toBasetype()->ty == Tbool &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8929 e2->type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8930 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8931 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8932 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8933 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8934 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8935 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8936 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8937 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8938 { e1->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8939 e2->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8940 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8941 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8942 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8943 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8944 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8945
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8946 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8947
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8948 OrExp::OrExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8949 : BinExp(loc, TOKor, sizeof(OrExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8950 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8951 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8952
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8953 Expression *OrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8954 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8955
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8956 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8957 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8958 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8959 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8960 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8961 if (e1->type->toBasetype()->ty == Tbool &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8962 e2->type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8963 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8964 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8965 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8966 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8967 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8968 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8969 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8970 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8971 { e1->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8972 e2->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
8973 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8974 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8975 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8976 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8977 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8978
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8979 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8980
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8981 XorExp::XorExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8982 : BinExp(loc, TOKxor, sizeof(XorExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8983 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8984 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8985
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8986 Expression *XorExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8987 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8988
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8989 if (!type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8990 { BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8991 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8992 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8993 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8994 if (e1->type->toBasetype()->ty == Tbool &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8995 e2->type->toBasetype()->ty == Tbool)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8996 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8997 type = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8998 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
8999 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9000 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9001 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9002 typeCombine(sc);
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9003 if (e1->op != TOKslice && e2->op != TOKslice)
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9004 { e1->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9005 e2->checkIntegral();
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9006 }
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9007 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9008 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9009 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9010 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9011
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9012
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9013 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9014
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9015 OrOrExp::OrOrExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9016 : BinExp(loc, TOKoror, sizeof(OrOrExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9017 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9018 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9019
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9020 Expression *OrOrExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9021 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9022 unsigned cs1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9023
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9024 // same as for AndAnd
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9025 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9026 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9027 e1 = e1->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9028 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9029 cs1 = sc->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9030
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9031 if (sc->flags & SCOPEstaticif)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9032 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9033 /* If in static if, don't evaluate e2 if we don't have to.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9034 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9035 e1 = e1->optimize(WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9036 if (e1->isBool(TRUE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9037 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9038 return new IntegerExp(loc, 1, Type::tboolean);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9039 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9040 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9041
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9042 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9043 sc->mergeCallSuper(loc, cs1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9044 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9045 e2 = e2->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9046
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9047 type = Type::tboolean;
779
ef7fe998f9b3 Fix return type of OrOr and AndAndExp being set incorrectly if rhs is void. Thanks wilsonk!
Christian Kamm <kamm incasoftware de>
parents: 723
diff changeset
9048 if (e2->type->ty == Tvoid)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9049 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9050 if (e2->op == TOKtype || e2->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9051 error("%s is not an expression", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9052 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9053 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9054
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9055 Expression *OrOrExp::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9056 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9057 e2 = e2->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9058 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9059 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9060
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9061 int OrOrExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9062 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9063 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9064 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9065
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9066 int OrOrExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9067 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9068 if (flag == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9069 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9070 return e1->checkSideEffect(2) || e2->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9071 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9072 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9073 { e1->checkSideEffect(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9074 return e2->checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9075 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9076 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9077
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9078 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9079
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9080 AndAndExp::AndAndExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9081 : BinExp(loc, TOKandand, sizeof(AndAndExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9082 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9083 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9084
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9085 Expression *AndAndExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9086 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9087 unsigned cs1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9088
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9089 // same as for OrOr
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9090 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9091 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9092 e1 = e1->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9093 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9094 cs1 = sc->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9095
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9096 if (sc->flags & SCOPEstaticif)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9097 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9098 /* If in static if, don't evaluate e2 if we don't have to.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9099 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9100 e1 = e1->optimize(WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9101 if (e1->isBool(FALSE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9102 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9103 return new IntegerExp(loc, 0, Type::tboolean);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9104 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9105 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9106
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9107 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9108 sc->mergeCallSuper(loc, cs1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9109 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9110 e2 = e2->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9111
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9112 type = Type::tboolean;
779
ef7fe998f9b3 Fix return type of OrOr and AndAndExp being set incorrectly if rhs is void. Thanks wilsonk!
Christian Kamm <kamm incasoftware de>
parents: 723
diff changeset
9113 if (e2->type->ty == Tvoid)
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9114 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9115 if (e2->op == TOKtype || e2->op == TOKimport)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9116 error("%s is not an expression", e2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9117 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9118 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9119
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9120 Expression *AndAndExp::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9121 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9122 e2 = e2->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9123 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9124 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9126 int AndAndExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9127 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9128 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9129 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9131 int AndAndExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9133 if (flag == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9134 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9135 return e1->checkSideEffect(2) || e2->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9136 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9137 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9138 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9139 e1->checkSideEffect(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9140 return e2->checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9141 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9142 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9143
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9144 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9145
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9146 InExp::InExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9147 : BinExp(loc, TOKin, sizeof(InExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9148 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9149 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9150
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9151 Expression *InExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9152 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9153
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9154 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9155 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9156
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9157 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9158 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9159 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9160 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9161
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9162 //type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9163 Type *t2b = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9164 if (t2b->ty != Taarray)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9165 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9166 error("rvalue of in expression must be an associative array, not %s", e2->type->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9167 type = Type::terror;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9168 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9169 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9170 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9171 TypeAArray *ta = (TypeAArray *)t2b;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9172
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9173 // Convert key to type of key
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9174 e1 = e1->implicitCastTo(sc, ta->index);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9175
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9176 // Return type is pointer to value
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9177 type = ta->nextOf()->pointerTo();
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9178 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9179 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9180 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9181
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9182 int InExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9183 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9184 return FALSE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9185 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9186
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9187
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9188 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9189
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9190 /* This deletes the key e1 from the associative array e2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9191 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9192
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9193 RemoveExp::RemoveExp(Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9194 : BinExp(loc, TOKremove, sizeof(RemoveExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9195 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9196 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9197 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9198
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9199 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9200
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9201 CmpExp::CmpExp(enum TOK op, Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9202 : BinExp(loc, op, sizeof(CmpExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9203 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9204 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9205
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9206 Expression *CmpExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9207 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9208 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9209 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9210
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9211 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9212 printf("CmpExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9213 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9214 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9215 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9216
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9217 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9218
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9219 if (e1->type->toBasetype()->ty == Tclass && e2->op == TOKnull ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9220 e2->type->toBasetype()->ty == Tclass && e1->op == TOKnull)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9221 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9222 error("do not use null when comparing class types");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9223 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9224
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9225 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9226 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9227 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9228 e = new CmpExp(op, loc, e, new IntegerExp(loc, 0, Type::tint32));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9229 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9230 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9231 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9232
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9233 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9234 type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9235
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9236 // Special handling for array comparisons
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9237 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9238 t2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9239 if ((t1->ty == Tarray || t1->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9240 (t2->ty == Tarray || t2->ty == Tsarray))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9241 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9242 if (!t1->next->equals(t2->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9243 error("array comparison type mismatch, %s vs %s", t1->next->toChars(), t2->next->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9244 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9245 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9246 else if (t1->ty == Tstruct || t2->ty == Tstruct ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9247 (t1->ty == Tclass && t2->ty == Tclass))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9248 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9249 if (t2->ty == Tstruct)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9250 error("need member function opCmp() for %s %s to compare", t2->toDsymbol(sc)->kind(), t2->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9251 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9252 error("need member function opCmp() for %s %s to compare", t1->toDsymbol(sc)->kind(), t1->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9253 e = this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9254 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9255 #if 1
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9256 else if (t1->iscomplex() || t2->iscomplex())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9257 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9258 error("compare not defined for complex operands");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9259 e = new IntegerExp(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9260 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9261 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9262 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9263 e = this;
510
6aee82889553 Merged DMD 1.034, array operations are not yet implemented ;)
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 486
diff changeset
9264 //printf("CmpExp: %s\n", e->toChars());
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9265 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9266 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9267
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9268 int CmpExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9269 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9270 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9271 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9272
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9273
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9274 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9275
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9276 EqualExp::EqualExp(enum TOK op, Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9277 : BinExp(loc, op, sizeof(EqualExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9278 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9279 assert(op == TOKequal || op == TOKnotequal);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9280 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9281
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9282 Expression *EqualExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9283 { Expression *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9284 Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9285 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9286
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9287 //printf("EqualExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9288 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9289 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9290
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9291 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9292
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9293 /* Before checking for operator overloading, check to see if we're
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9294 * comparing the addresses of two statics. If so, we can just see
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9295 * if they are the same symbol.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9296 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9297 if (e1->op == TOKaddress && e2->op == TOKaddress)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9298 { AddrExp *ae1 = (AddrExp *)e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9299 AddrExp *ae2 = (AddrExp *)e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9300
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9301 if (ae1->e1->op == TOKvar && ae2->e1->op == TOKvar)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9302 { VarExp *ve1 = (VarExp *)ae1->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9303 VarExp *ve2 = (VarExp *)ae2->e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9304
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9305 if (ve1->var == ve2->var /*|| ve1->var->toSymbol() == ve2->var->toSymbol()*/)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9306 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9307 // They are the same, result is 'true' for ==, 'false' for !=
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9308 e = new IntegerExp(loc, (op == TOKequal), Type::tboolean);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9309 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9310 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9311 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9312 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9313
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9314 if (e1->type->toBasetype()->ty == Tclass && e2->op == TOKnull ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9315 e2->type->toBasetype()->ty == Tclass && e1->op == TOKnull)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9316 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9317 error("use '%s' instead of '%s' when comparing with null",
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9318 Token::toChars(op == TOKequal ? TOKidentity : TOKnotidentity),
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9319 Token::toChars(op));
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9320 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9321
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9322 //if (e2->op != TOKnull)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9323 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9324 e = op_overload(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9325 if (e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9326 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9327 if (op == TOKnotequal)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9328 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9329 e = new NotExp(e->loc, e);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9330 e = e->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9331 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9332 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9333 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9334 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9335
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9336 e = typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9337 type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9338
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9339 // Special handling for array comparisons
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9340 t1 = e1->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9341 t2 = e2->type->toBasetype();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9342 if ((t1->ty == Tarray || t1->ty == Tsarray) &&
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9343 (t2->ty == Tarray || t2->ty == Tsarray))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9344 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9345 if (!t1->next->equals(t2->next))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9346 error("array comparison type mismatch, %s vs %s", t1->next->toChars(), t2->next->toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9347 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9348 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9349 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9350 if (e1->type != e2->type && e1->type->isfloating() && e2->type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9351 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9352 // Cast both to complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9353 e1 = e1->castTo(sc, Type::tcomplex80);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9354 e2 = e2->castTo(sc, Type::tcomplex80);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9355 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9356 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9357 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9358 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9359
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9360 int EqualExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9361 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9362 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9363 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9364
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9365
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9366
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9367 /************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9368
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9369 IdentityExp::IdentityExp(enum TOK op, Loc loc, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9370 : BinExp(loc, op, sizeof(IdentityExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9371 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9372 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9373
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9374 Expression *IdentityExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9375 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9376 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9377 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9378
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9379 BinExp::semanticp(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9380 type = Type::tboolean;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9381 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9382 if (e1->type != e2->type && e1->type->isfloating() && e2->type->isfloating())
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9383 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9384 // Cast both to complex
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9385 e1 = e1->castTo(sc, Type::tcomplex80);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9386 e2 = e2->castTo(sc, Type::tcomplex80);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9387 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9388 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9389 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9390
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9391 int IdentityExp::isBit()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9392 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9393 return TRUE;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9394 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9395
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9396
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9397 /****************************************************************/
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9398
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9399 CondExp::CondExp(Loc loc, Expression *econd, Expression *e1, Expression *e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9400 : BinExp(loc, TOKquestion, sizeof(CondExp), e1, e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9401 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9402 this->econd = econd;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9403 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9404
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9405 Expression *CondExp::syntaxCopy()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9406 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9407 return new CondExp(loc, econd->syntaxCopy(), e1->syntaxCopy(), e2->syntaxCopy());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9408 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9409
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9410
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9411 Expression *CondExp::semantic(Scope *sc)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9412 { Type *t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9413 Type *t2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9414 unsigned cs0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9415 unsigned cs1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9416
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9417 #if LOGSEMANTIC
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9418 printf("CondExp::semantic('%s')\n", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9419 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9420 if (type)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9421 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9422
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9423 econd = econd->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9424 econd = resolveProperties(sc, econd);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9425 econd = econd->checkToPointer();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9426 econd = econd->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9427
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9428 #if 0 /* this cannot work right because the types of e1 and e2
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9429 * both contribute to the type of the result.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9430 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9431 if (sc->flags & SCOPEstaticif)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9432 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9433 /* If in static if, don't evaluate what we don't have to.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9434 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9435 econd = econd->optimize(WANTflags);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9436 if (econd->isBool(TRUE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9437 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9438 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9439 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9440 return e1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9441 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9442 else if (econd->isBool(FALSE))
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9443 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9444 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9445 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9446 return e2;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9447 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9448 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9449 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9450
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9451
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9452 cs0 = sc->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9453 e1 = e1->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9454 e1 = resolveProperties(sc, e1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9455 cs1 = sc->callSuper;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9456 sc->callSuper = cs0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9457 e2 = e2->semantic(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9458 e2 = resolveProperties(sc, e2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9459 sc->mergeCallSuper(loc, cs1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9460
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9461
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9462 // If either operand is void, the result is void
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9463 t1 = e1->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9464 t2 = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9465 if (t1->ty == Tvoid || t2->ty == Tvoid)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9466 type = Type::tvoid;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9467 else if (t1 == t2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9468 type = t1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9469 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9470 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9471 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9472 switch (e1->type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9473 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9474 case Tcomplex32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9475 case Tcomplex64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9476 case Tcomplex80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9477 e2 = e2->castTo(sc, e1->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9478 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9479 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9480 switch (e2->type->toBasetype()->ty)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9481 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9482 case Tcomplex32:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9483 case Tcomplex64:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9484 case Tcomplex80:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9485 e1 = e1->castTo(sc, e2->type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9486 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9487 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9488 }
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9489 #if 0
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9490 printf("res: %s\n", type->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9491 printf("e1 : %s\n", e1->type->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9492 printf("e2 : %s\n", e2->type->toChars());
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9493 #endif
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9494 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9495 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9496
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9497 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9498 int CondExp::isLvalue()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9499 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9500 return e1->isLvalue() && e2->isLvalue();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9501 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9502 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9503
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9504 Expression *CondExp::toLvalue(Scope *sc, Expression *ex)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9505 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9506 PtrExp *e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9507
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9508 // convert (econd ? e1 : e2) to *(econd ? &e1 : &e2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9509 e = new PtrExp(loc, this, type);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9510
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9511 e1 = e1->addressOf(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9512 //e1 = e1->toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9513
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9514 e2 = e2->addressOf(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9515 //e2 = e2->toLvalue(sc, NULL);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9516
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9517 typeCombine(sc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9518
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9519 type = e2->type;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9520 return e;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9521 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9522
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9523 Expression *CondExp::modifiableLvalue(Scope *sc, Expression *e)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9524 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9525 error("conditional expression %s is not a modifiable lvalue", toChars());
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9526 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9527 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9528
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9529 void CondExp::checkEscape()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9530 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9531 e1->checkEscape();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9532 e2->checkEscape();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9533 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9534
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9535
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9536 Expression *CondExp::checkToBoolean()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9537 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9538 e1 = e1->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9539 e2 = e2->checkToBoolean();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9540 return this;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9541 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9542
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9543 int CondExp::checkSideEffect(int flag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9544 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9545 if (flag == 2)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9546 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9547 return econd->checkSideEffect(2) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9548 e1->checkSideEffect(2) ||
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9549 e2->checkSideEffect(2);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9550 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9551 else
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9552 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9553 econd->checkSideEffect(1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9554 e1->checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9555 return e2->checkSideEffect(flag);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9556 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9557 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9558
875
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9559 #if DMDV2
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9560 int CondExp::canThrow()
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9561 {
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9562 return econd->canThrow() || e1->canThrow() || e2->canThrow();
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9563 }
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9564 #endif
330f999ade44 Merged DMD 1.038
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 846
diff changeset
9565
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9566 void CondExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9567 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9568 expToCBuffer(buf, hgs, econd, PREC_oror);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9569 buf->writestring(" ? ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9570 expToCBuffer(buf, hgs, e1, PREC_expr);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9571 buf->writestring(" : ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9572 expToCBuffer(buf, hgs, e2, PREC_cond);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9573 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 139
diff changeset
9574
599
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9575 /************************************************************/
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9576
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9577 #if IN_LLVM
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9578
664
eef8ac26c66c Some missed LLVMDC -> LDC.
Christian Kamm <kamm incasoftware de>
parents: 639
diff changeset
9579 // Strictly LDC specific stuff
599
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9580
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9581 GEPExp::GEPExp(Loc loc, Expression* e, Identifier* id, unsigned idx)
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9582 : UnaExp(loc, TOKgep, sizeof(GEPExp), e)
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9583 {
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9584 index = idx;
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9585 ident = id;
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9586 }
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9587
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9588 void GEPExp::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9589 {
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9590 expToCBuffer(buf, hgs, e1, PREC_primary);
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9591 buf->writeByte('.');
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9592 buf->writestring(ident->toChars());
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9593 }
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9594
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9595 Expression* GEPExp::toLvalue(Scope* sc, Expression* e)
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9596 {
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9597 // GEP's are always lvalues, at least in the "LLVM sense" ...
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9598 return this;
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9599 }
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9600
4435f57956e7 Fixed .funcptr property of delegates, no longer uses the infamous DMD rewrites to pointer arithmetic, instead a GEPExp has been introduced.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 585
diff changeset
9601 #endif