Mercurial > projects > ldc
view tests/mini/funcptr.d @ 1346:6f4154b318ef
Remove an old workaround that was kept around for ABI-compatibility on x86-64
between different LLVM versions.
This means LLVM r67588 is required if you want to compile for x86-64, otherwise
the backend will assert when you try to return e.g. struct { int i; char c; }
from a function. (In particular, this is no longer compatible with LLVM 2.5)
It also means that any code returning small structs on x86-64 will probably
need to be recompiled in order to be linkable to code compiled with this change.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Tue, 12 May 2009 15:50:48 +0200 |
parents | 1bb99290e03a |
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"); }