Mercurial > projects > ldc
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, |