comparison dmd/constfold.c @ 305:2b72433d5c8c trunk

[svn r326] Fixed a bunch of issues with printf's that MinGW32 did not support. Fixed problems with label collisions when using labels inside inline asm. LabelStatement is now easily reached given its Identifier, which should be useful elsewhere too. Enabled inline asm for building the lib/compiler/llvmdc runtime code, fixing branches out of asm makes this possible.
author lindquist
date Fri, 27 Jun 2008 22:04:35 +0200
parents 3cfcb944304e
children aaade6ded589
comparison
equal deleted inserted replaced
304:3ebc136702dd 305:2b72433d5c8c
1158 if (e1->op == TOKstring && e2->op == TOKint64) 1158 if (e1->op == TOKstring && e2->op == TOKint64)
1159 { StringExp *es1 = (StringExp *)e1; 1159 { StringExp *es1 = (StringExp *)e1;
1160 uinteger_t i = e2->toInteger(); 1160 uinteger_t i = e2->toInteger();
1161 1161
1162 if (i >= es1->len) 1162 if (i >= es1->len)
1163 e1->error("string index %ju is out of bounds [0 .. %zu]", i, es1->len); 1163 e1->error("string index %llu is out of bounds [0 .. %"PRIuSIZE"]", i, es1->len);
1164 else 1164 else
1165 { unsigned value = es1->charAt(i); 1165 { unsigned value = es1->charAt(i);
1166 e = new IntegerExp(loc, value, type); 1166 e = new IntegerExp(loc, value, type);
1167 } 1167 }
1168 } 1168 }
1170 { TypeSArray *tsa = (TypeSArray *)e1->type->toBasetype(); 1170 { TypeSArray *tsa = (TypeSArray *)e1->type->toBasetype();
1171 uinteger_t length = tsa->dim->toInteger(); 1171 uinteger_t length = tsa->dim->toInteger();
1172 uinteger_t i = e2->toInteger(); 1172 uinteger_t i = e2->toInteger();
1173 1173
1174 if (i >= length) 1174 if (i >= length)
1175 { e2->error("array index %ju is out of bounds %s[0 .. %ju]", i, e1->toChars(), length); 1175 {
1176 e2->error("array index %llu is out of bounds %s[0 .. %llu]", i, e1->toChars(), length);
1176 } 1177 }
1177 else if (e1->op == TOKarrayliteral && !e1->checkSideEffect(2)) 1178 else if (e1->op == TOKarrayliteral && !e1->checkSideEffect(2))
1178 { ArrayLiteralExp *ale = (ArrayLiteralExp *)e1; 1179 { ArrayLiteralExp *ale = (ArrayLiteralExp *)e1;
1179 e = (Expression *)ale->elements->data[i]; 1180 e = (Expression *)ale->elements->data[i];
1180 e->type = type; 1181 e->type = type;
1185 uinteger_t i = e2->toInteger(); 1186 uinteger_t i = e2->toInteger();
1186 1187
1187 if (e1->op == TOKarrayliteral && !e1->checkSideEffect(2)) 1188 if (e1->op == TOKarrayliteral && !e1->checkSideEffect(2))
1188 { ArrayLiteralExp *ale = (ArrayLiteralExp *)e1; 1189 { ArrayLiteralExp *ale = (ArrayLiteralExp *)e1;
1189 if (i >= ale->elements->dim) 1190 if (i >= ale->elements->dim)
1190 { e2->error("array index %ju is out of bounds %s[0 .. %u]", i, e1->toChars(), ale->elements->dim); 1191 {
1192 e2->error("array index %llu is out of bounds %s[0 .. %u]", i, e1->toChars(), ale->elements->dim);
1191 } 1193 }
1192 else 1194 else
1193 { e = (Expression *)ale->elements->data[i]; 1195 { e = (Expression *)ale->elements->data[i];
1194 e->type = type; 1196 e->type = type;
1195 } 1197 }
1235 { StringExp *es1 = (StringExp *)e1; 1237 { StringExp *es1 = (StringExp *)e1;
1236 uinteger_t ilwr = lwr->toInteger(); 1238 uinteger_t ilwr = lwr->toInteger();
1237 uinteger_t iupr = upr->toInteger(); 1239 uinteger_t iupr = upr->toInteger();
1238 1240
1239 if (iupr > es1->len || ilwr > iupr) 1241 if (iupr > es1->len || ilwr > iupr)
1240 e1->error("string slice [%ju .. %ju] is out of bounds", ilwr, iupr); 1242 e1->error("string slice [%llu .. %llu] is out of bounds", ilwr, iupr);
1241 else 1243 else
1242 { integer_t value; 1244 { integer_t value;
1243 void *s; 1245 void *s;
1244 size_t len = iupr - ilwr; 1246 size_t len = iupr - ilwr;
1245 int sz = es1->sz; 1247 int sz = es1->sz;
1262 { ArrayLiteralExp *es1 = (ArrayLiteralExp *)e1; 1264 { ArrayLiteralExp *es1 = (ArrayLiteralExp *)e1;
1263 uinteger_t ilwr = lwr->toInteger(); 1265 uinteger_t ilwr = lwr->toInteger();
1264 uinteger_t iupr = upr->toInteger(); 1266 uinteger_t iupr = upr->toInteger();
1265 1267
1266 if (iupr > es1->elements->dim || ilwr > iupr) 1268 if (iupr > es1->elements->dim || ilwr > iupr)
1267 e1->error("array slice [%ju .. %ju] is out of bounds", ilwr, iupr); 1269 e1->error("array slice [%llu .. %llu] is out of bounds", ilwr, iupr);
1268 else 1270 else
1269 { 1271 {
1270 Expressions *elements = new Expressions(); 1272 Expressions *elements = new Expressions();
1271 elements->setDim(iupr - ilwr); 1273 elements->setDim(iupr - ilwr);
1272 memcpy(elements->data, 1274 memcpy(elements->data,