view test/funcptr.d @ 302:bef811104734 trunk

[svn r323] Branching out of inline asm works. Renamed emit_finallyblocks to DtoFinallyBlocks and moved to llvmhelpers. Added enclosingtryfinally to AsmBlockStatement, so branches out of asm blocks respect finallys. Refactored some GotoStatement code into DtoGoto.
author ChristianK
date Wed, 25 Jun 2008 20:39:09 +0200
parents d9d5d59873d8
children
line wrap: on
line source

extern(C) int printf(char*, ...);

int return_six()
{
    return 6;
}

int add_int(int a, int b)
{
    return a+b;
}

int sub_int(int a, int b)
{
    return a-b;
}

alias int function(int,int) binfn_t;

int binop_int(binfn_t op, int a, int b)
{
    return op(a,b);
}

binfn_t get_binop_int(char op)
{
    binfn_t fn;
    if (op == '+')
        fn = &add_int;
    else if (op == '-')
        fn = &sub_int;
    return fn;
}

extern(C) float mul_float(float a, float b)
{
    return a * b;
}

void function_pointers()
{
    int function() fn = &return_six;
    assert(fn() == 6);

    binfn_t binfn = &add_int;
    assert(binfn(4,1045) == 1049);

    assert(binop_int(binfn, 10,656) == 666);

    binfn = get_binop_int('+');
    assert(binop_int(binfn, 10,100) == 110);
    binfn = get_binop_int('-');
    assert(binop_int(binfn, 10,100) == -90);

    {
    auto ffn = &mul_float;
    float ftmp = mul_float(2.5,5);
    assert(ftmp == 12.5);
    assert(ftmp > 12.49 && ftmp < 12.51);
    }
}

void main()
{
    printf("Function pointer test\n");
    function_pointers();
    printf("  SUCCESS\n");
}