Mercurial > projects > ldc
view tests/mini/intrinsics_ovf.d @ 1605:1d5721f9ae18
[WIP] Merge DMD r251: bugzilla 111 (appending a dchar to a char[])
This patch needs some work in the code generation, because of the runtime
changes (functions "_d_arrayappendcd" and "_d_arrayappendwd" are added).
This doesn't affect existing code though, it just makes with patch
a little useless, because something like this:
char [] s;
s ~= '\u6211';
That failed to compile with a nice error message previously to this
change, now fails with and ugly error message (a failed assertion).
Apparently there is a regression introduced by this patch too, when
compiling Dil I get this assertion message:
ldc: /home/luca/tesis/ldc/gen/statements.cpp:132: virtual void ReturnStatement::toIR(IRState*): Assertion `p->topfunc()->getReturnType() == llvm::Type::getVoidTy(gIR->context())' failed.
0 ldc 0x08a91628
Thank god we have bisecting capabilities in VCSs now ;)
---
dmd/expression.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 41 insertions(+), 6 deletions(-)
author | Leandro Lucarella <llucax@gmail.com> |
---|---|
date | Wed, 06 Jan 2010 15:18:19 -0300 |
parents | 34f2fd925de3 |
children |
line wrap: on
line source
module intrinsics_ovf; //version = PRINTF; version(PRINTF) extern(C) int printf(char*, ...); import ldc.intrinsics; int saddo(int a, int b, out bool overflow) { auto Result = llvm_sadd_with_overflow(a, b); overflow = Result.overflow; return Result.result; } int uaddo(int a, int b, out bool overflow) { auto Result = llvm_uadd_with_overflow(a, b); overflow = Result.overflow; return Result.result; } int smulo(int a, int b, out bool overflow) { auto Result = llvm_smul_with_overflow(a, b); overflow = Result.overflow; return Result.result; } /* uint umulo(uint a, uint b, out bool overflow) { auto Result = llvm_umul_with_overflow(a, b); overflow = Result.overflow; return Result.result; } */ void test(int function(int, int, out bool) fn, int a, int b, int result_e, bool ovf_e) { version(PRINTF) printf("%8x :: %8x :: %8x :: %.*s\n", a, b, result_e, (ovf_e ? "true" : "false")); bool ovf; int result = fn(a, b, ovf); version(PRINTF) printf("____________________ %8x :: %.*s\n", result, (ovf ? "true" : "false")); assert(ovf == ovf_e); assert(result == result_e); } void main() { test(&saddo, int.min, int.min, int.min + int.min, true); test(&saddo, int.min, int.max, int.min + int.max, false); test(&saddo, 1, int.max, 1 + int.max, true); test(&saddo, 1, 2, 3, false); test(&saddo, -1, -2, -3, false); test(&uaddo, 0, uint.max, 0 + uint.max, false); test(&uaddo, 1, uint.max, 1 + uint.max, true); test(&uaddo, 1, 2, 3, false); test(&smulo, int.min, int.min, int.min * int.min, true); test(&smulo, int.min, int.max, int.min * int.max, true); test(&smulo, int.max, int.max, int.max * int.max, true); test(&smulo, 1, int.max, 1 * int.max, false); test(&smulo, 2, int.max/2, 2 * (int.max/2), false); test(&smulo, 2, int.max/2 + 1, 2 * (int.max/2 + 1), true); test(&smulo, 2, int.min/2, 2 * (int.min/2), false); test(&smulo, 2, int.min/2 - 1, 2 * (int.min/2 - 1), true); test(&smulo, 1, 2, 2, false); test(&smulo, -1, -2, 2, false); }