mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-10 01:30:57 +00:00
Create more double related tests
Including catching warnings :) (yay -Werror)
This commit is contained in:
parent
7e7e0526dd
commit
0542daacdf
6 changed files with 265 additions and 17 deletions
|
@ -47,6 +47,7 @@ typedef struct {
|
||||||
|
|
||||||
static expr_t *pointer_arithmetic (int op, expr_t *e1, expr_t *e2);
|
static expr_t *pointer_arithmetic (int op, expr_t *e1, expr_t *e2);
|
||||||
static expr_t *inverse_multiply (int op, expr_t *e1, expr_t *e2);
|
static expr_t *inverse_multiply (int op, expr_t *e1, expr_t *e2);
|
||||||
|
static expr_t *double_compare (int op, expr_t *e1, expr_t *e2);
|
||||||
|
|
||||||
static expr_type_t string_string[] = {
|
static expr_type_t string_string[] = {
|
||||||
{'+', &type_string},
|
{'+', &type_string},
|
||||||
|
@ -111,6 +112,21 @@ static expr_type_t float_integer[] = {
|
||||||
#define float_uinteger float_integer
|
#define float_uinteger float_integer
|
||||||
#define float_short float_integer
|
#define float_short float_integer
|
||||||
|
|
||||||
|
static expr_type_t float_double[] = {
|
||||||
|
{'+', &type_double, &type_double, 0},
|
||||||
|
{'-', &type_double, &type_double, 0},
|
||||||
|
{'*', &type_double, &type_double, 0},
|
||||||
|
{'/', &type_double, &type_double, 0},
|
||||||
|
{'%', &type_double, &type_double, 0},
|
||||||
|
{EQ, 0, 0, 0, double_compare},
|
||||||
|
{NE, 0, 0, 0, double_compare},
|
||||||
|
{LE, 0, 0, 0, double_compare},
|
||||||
|
{GE, 0, 0, 0, double_compare},
|
||||||
|
{LT, 0, 0, 0, double_compare},
|
||||||
|
{GT, 0, 0, 0, double_compare},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
static expr_type_t vector_float[] = {
|
static expr_type_t vector_float[] = {
|
||||||
{'*', &type_vector},
|
{'*', &type_vector},
|
||||||
{'/', 0, 0, 0, inverse_multiply},
|
{'/', 0, 0, 0, inverse_multiply},
|
||||||
|
@ -130,6 +146,12 @@ static expr_type_t vector_vector[] = {
|
||||||
#define vector_uinteger vector_float
|
#define vector_uinteger vector_float
|
||||||
#define vector_short vector_float
|
#define vector_short vector_float
|
||||||
|
|
||||||
|
static expr_type_t vector_double[] = {
|
||||||
|
{'*', &type_vector},
|
||||||
|
{'/', 0, 0, 0, inverse_multiply},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
static expr_type_t entity_entity[] = {
|
static expr_type_t entity_entity[] = {
|
||||||
{EQ, &type_integer},
|
{EQ, &type_integer},
|
||||||
{NE, &type_integer},
|
{NE, &type_integer},
|
||||||
|
@ -195,6 +217,12 @@ static expr_type_t quat_integer[] = {
|
||||||
#define quat_uinteger quat_integer
|
#define quat_uinteger quat_integer
|
||||||
#define quat_short quat_integer
|
#define quat_short quat_integer
|
||||||
|
|
||||||
|
static expr_type_t quat_double[] = {
|
||||||
|
{'*', &type_quaternion},
|
||||||
|
{'/', 0, 0, 0, inverse_multiply},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
static expr_type_t integer_float[] = {
|
static expr_type_t integer_float[] = {
|
||||||
{'+', &type_float, &type_float, 0},
|
{'+', &type_float, &type_float, 0},
|
||||||
{'-', &type_float, &type_float, 0},
|
{'-', &type_float, &type_float, 0},
|
||||||
|
@ -290,6 +318,21 @@ static expr_type_t integer_short[] = {
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static expr_type_t integer_double[] = {
|
||||||
|
{'+', &type_double, &type_double, 0},
|
||||||
|
{'-', &type_double, &type_double, 0},
|
||||||
|
{'*', &type_double, &type_double, 0},
|
||||||
|
{'/', &type_double, &type_double, 0},
|
||||||
|
{'%', &type_double, &type_double, 0},
|
||||||
|
{EQ, &type_integer, &type_double, 0},
|
||||||
|
{NE, &type_integer, &type_double, 0},
|
||||||
|
{LE, &type_integer, &type_double, 0},
|
||||||
|
{GE, &type_integer, &type_double, 0},
|
||||||
|
{LT, &type_integer, &type_double, 0},
|
||||||
|
{GT, &type_integer, &type_double, 0},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
#define uinteger_float integer_float
|
#define uinteger_float integer_float
|
||||||
#define uinteger_vector integer_vector
|
#define uinteger_vector integer_vector
|
||||||
#define uinteger_pointer integer_pointer
|
#define uinteger_pointer integer_pointer
|
||||||
|
@ -335,6 +378,7 @@ static expr_type_t uinteger_uinteger[] = {
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
#define uinteger_short uinteger_integer
|
#define uinteger_short uinteger_integer
|
||||||
|
#define uinteger_double integer_double
|
||||||
|
|
||||||
#define short_float integer_float
|
#define short_float integer_float
|
||||||
#define short_vector integer_vector
|
#define short_vector integer_vector
|
||||||
|
@ -400,8 +444,66 @@ static expr_type_t short_short[] = {
|
||||||
{GT, &type_integer},
|
{GT, &type_integer},
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
#define short_double integer_double
|
||||||
|
|
||||||
static expr_type_t *string_x[] = {
|
static expr_type_t double_float[] = {
|
||||||
|
{'+', &type_double, 0, &type_double},
|
||||||
|
{'-', &type_double, 0, &type_double},
|
||||||
|
{'*', &type_double, 0, &type_double},
|
||||||
|
{'/', &type_double, 0, &type_double},
|
||||||
|
{'%', &type_double, 0, &type_double},
|
||||||
|
{EQ, 0, 0, 0, double_compare},
|
||||||
|
{NE, 0, 0, 0, double_compare},
|
||||||
|
{LE, 0, 0, 0, double_compare},
|
||||||
|
{GE, 0, 0, 0, double_compare},
|
||||||
|
{LT, 0, 0, 0, double_compare},
|
||||||
|
{GT, 0, 0, 0, double_compare},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static expr_type_t double_vector[] = {
|
||||||
|
{'*', &type_vector},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static expr_type_t double_quat[] = {
|
||||||
|
{'*', &type_quaternion},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static expr_type_t double_integer[] = {
|
||||||
|
{'+', &type_double, 0, &type_double},
|
||||||
|
{'-', &type_double, 0, &type_double},
|
||||||
|
{'*', &type_double, 0, &type_double},
|
||||||
|
{'/', &type_double, 0, &type_double},
|
||||||
|
{'%', &type_double, 0, &type_double},
|
||||||
|
{EQ, 0, 0, 0, double_compare},
|
||||||
|
{NE, 0, 0, 0, double_compare},
|
||||||
|
{LE, 0, 0, 0, double_compare},
|
||||||
|
{GE, 0, 0, 0, double_compare},
|
||||||
|
{LT, 0, 0, 0, double_compare},
|
||||||
|
{GT, 0, 0, 0, double_compare},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
#define double_uinteger double_integer
|
||||||
|
#define double_short double_integer
|
||||||
|
|
||||||
|
static expr_type_t double_double[] = {
|
||||||
|
{'+', &type_double},
|
||||||
|
{'-', &type_double},
|
||||||
|
{'*', &type_double},
|
||||||
|
{'/', &type_double},
|
||||||
|
{'%', &type_double},
|
||||||
|
{EQ, &type_integer},
|
||||||
|
{NE, &type_integer},
|
||||||
|
{LE, &type_integer},
|
||||||
|
{GE, &type_integer},
|
||||||
|
{LT, &type_integer},
|
||||||
|
{GT, &type_integer},
|
||||||
|
{0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
static expr_type_t *string_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
string_string,
|
string_string,
|
||||||
0, // ev_float
|
0, // ev_float
|
||||||
|
@ -414,9 +516,10 @@ static expr_type_t *string_x[] = {
|
||||||
0, // ev_integer
|
0, // ev_integer
|
||||||
0, // ev_uinteger
|
0, // ev_uinteger
|
||||||
0, // ev_short
|
0, // ev_short
|
||||||
|
0, // ev_double
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *float_x[] = {
|
static expr_type_t *float_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
float_float,
|
float_float,
|
||||||
|
@ -429,9 +532,10 @@ static expr_type_t *float_x[] = {
|
||||||
float_integer,
|
float_integer,
|
||||||
float_uinteger,
|
float_uinteger,
|
||||||
float_short,
|
float_short,
|
||||||
|
float_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *vector_x[] = {
|
static expr_type_t *vector_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
vector_float,
|
vector_float,
|
||||||
|
@ -444,9 +548,10 @@ static expr_type_t *vector_x[] = {
|
||||||
vector_integer,
|
vector_integer,
|
||||||
vector_uinteger,
|
vector_uinteger,
|
||||||
vector_short,
|
vector_short,
|
||||||
|
vector_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *entity_x[] = {
|
static expr_type_t *entity_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
0, // ev_float
|
0, // ev_float
|
||||||
|
@ -459,9 +564,10 @@ static expr_type_t *entity_x[] = {
|
||||||
0, // ev_integer
|
0, // ev_integer
|
||||||
0, // ev_uinteger
|
0, // ev_uinteger
|
||||||
0, // ev_short
|
0, // ev_short
|
||||||
|
0, // ev_double
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *field_x[] = {
|
static expr_type_t *field_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
0, // ev_float
|
0, // ev_float
|
||||||
|
@ -474,9 +580,10 @@ static expr_type_t *field_x[] = {
|
||||||
0, // ev_integer
|
0, // ev_integer
|
||||||
0, // ev_uinteger
|
0, // ev_uinteger
|
||||||
0, // ev_short
|
0, // ev_short
|
||||||
|
0, // ev_double
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *func_x[] = {
|
static expr_type_t *func_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
0, // ev_float
|
0, // ev_float
|
||||||
|
@ -489,9 +596,10 @@ static expr_type_t *func_x[] = {
|
||||||
0, // ev_integer
|
0, // ev_integer
|
||||||
0, // ev_uinteger
|
0, // ev_uinteger
|
||||||
0, // ev_short
|
0, // ev_short
|
||||||
|
0, // ev_double
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *pointer_x[] = {
|
static expr_type_t *pointer_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
0, // ev_float
|
0, // ev_float
|
||||||
|
@ -504,9 +612,10 @@ static expr_type_t *pointer_x[] = {
|
||||||
pointer_integer,
|
pointer_integer,
|
||||||
pointer_uinteger,
|
pointer_uinteger,
|
||||||
pointer_short,
|
pointer_short,
|
||||||
|
0, // ev_double
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *quat_x[] = {
|
static expr_type_t *quat_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
quat_float,
|
quat_float,
|
||||||
|
@ -519,9 +628,10 @@ static expr_type_t *quat_x[] = {
|
||||||
quat_integer,
|
quat_integer,
|
||||||
quat_uinteger,
|
quat_uinteger,
|
||||||
quat_short,
|
quat_short,
|
||||||
|
quat_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *integer_x[] = {
|
static expr_type_t *integer_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
integer_float,
|
integer_float,
|
||||||
|
@ -534,9 +644,10 @@ static expr_type_t *integer_x[] = {
|
||||||
integer_integer,
|
integer_integer,
|
||||||
integer_uinteger,
|
integer_uinteger,
|
||||||
integer_short,
|
integer_short,
|
||||||
|
integer_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *uinteger_x[] = {
|
static expr_type_t *uinteger_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
uinteger_float,
|
uinteger_float,
|
||||||
|
@ -549,9 +660,10 @@ static expr_type_t *uinteger_x[] = {
|
||||||
uinteger_integer,
|
uinteger_integer,
|
||||||
uinteger_uinteger,
|
uinteger_uinteger,
|
||||||
uinteger_short,
|
uinteger_short,
|
||||||
|
uinteger_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t *short_x[] = {
|
static expr_type_t *short_x[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
0, // ev_string
|
0, // ev_string
|
||||||
short_float,
|
short_float,
|
||||||
|
@ -564,9 +676,26 @@ static expr_type_t *short_x[] = {
|
||||||
short_integer,
|
short_integer,
|
||||||
short_uinteger,
|
short_uinteger,
|
||||||
short_short,
|
short_short,
|
||||||
|
short_double,
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_type_t **binary_expr_types[] = {
|
static expr_type_t *double_x[ev_type_count] = {
|
||||||
|
0, // ev_void
|
||||||
|
0, // ev_string
|
||||||
|
double_float,
|
||||||
|
double_vector,
|
||||||
|
0, // ev_entity
|
||||||
|
0, // ev_field
|
||||||
|
0, // ev_func
|
||||||
|
0, // ev_pointer
|
||||||
|
double_quat,
|
||||||
|
double_integer,
|
||||||
|
double_uinteger,
|
||||||
|
double_short,
|
||||||
|
double_double,
|
||||||
|
};
|
||||||
|
|
||||||
|
static expr_type_t **binary_expr_types[ev_type_count] = {
|
||||||
0, // ev_void
|
0, // ev_void
|
||||||
string_x,
|
string_x,
|
||||||
float_x,
|
float_x,
|
||||||
|
@ -579,6 +708,7 @@ static expr_type_t **binary_expr_types[] = {
|
||||||
integer_x,
|
integer_x,
|
||||||
uinteger_x,
|
uinteger_x,
|
||||||
short_x,
|
short_x,
|
||||||
|
double_x
|
||||||
};
|
};
|
||||||
|
|
||||||
static expr_t *
|
static expr_t *
|
||||||
|
@ -609,6 +739,36 @@ inverse_multiply (int op, expr_t *e1, expr_t *e2)
|
||||||
return binary_expr ('*', e1, binary_expr ('/', one, e2));
|
return binary_expr ('*', e1, binary_expr ('/', one, e2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static expr_t *
|
||||||
|
double_compare (int op, expr_t *e1, expr_t *e2)
|
||||||
|
{
|
||||||
|
type_t *t1 = get_type (e1);
|
||||||
|
type_t *t2 = get_type (e2);
|
||||||
|
expr_t *e;
|
||||||
|
|
||||||
|
if ((is_double (t1) && is_float (t2))
|
||||||
|
|| (is_float (t1) && is_double (t2))) {
|
||||||
|
}
|
||||||
|
if (is_double (t1)) {
|
||||||
|
if (is_float (t2)) {
|
||||||
|
warning (e2, "comparison between double and float");
|
||||||
|
} else if (!is_constant (e2)) {
|
||||||
|
warning (e2, "comparison between double and integer");
|
||||||
|
}
|
||||||
|
e2 = cast_expr (&type_double, e2);
|
||||||
|
} else {
|
||||||
|
if (is_float (t1)) {
|
||||||
|
warning (e1, "comparison between float and double");
|
||||||
|
} else if (!is_constant (e1)) {
|
||||||
|
warning (e1, "comparison between integer and double");
|
||||||
|
}
|
||||||
|
e1 = cast_expr (&type_double, e1);
|
||||||
|
}
|
||||||
|
e = new_binary_expr (op, e1, e2);
|
||||||
|
e->e.expr.type = &type_double;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
static expr_t *
|
static expr_t *
|
||||||
invalid_binary_expr (int op, expr_t *e1, expr_t *e2)
|
invalid_binary_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
{
|
{
|
||||||
|
@ -778,9 +938,9 @@ binary_expr (int op, expr_t *e1, expr_t *e2)
|
||||||
et1 = low_level_type (t1);
|
et1 = low_level_type (t1);
|
||||||
et2 = low_level_type (t2);
|
et2 = low_level_type (t2);
|
||||||
|
|
||||||
if (et1 > ev_short || !binary_expr_types[et1])
|
if (et1 >= ev_type_count || !binary_expr_types[et1])
|
||||||
return invalid_binary_expr(op, e1, e2);
|
return invalid_binary_expr(op, e1, e2);
|
||||||
if (et2 > ev_short || !binary_expr_types[et1][et2])
|
if (et2 >= ev_type_count || !binary_expr_types[et1][et2])
|
||||||
return invalid_binary_expr(op, e1, e2);
|
return invalid_binary_expr(op, e1, e2);
|
||||||
expr_type = binary_expr_types[et1][et2];
|
expr_type = binary_expr_types[et1][et2];
|
||||||
while (expr_type->op && expr_type->op != op)
|
while (expr_type->op && expr_type->op != op)
|
||||||
|
|
|
@ -58,11 +58,23 @@ test_progs_dat=\
|
||||||
|
|
||||||
fail_progs_dat=
|
fail_progs_dat=
|
||||||
|
|
||||||
|
test_build_errors=\
|
||||||
|
double-int-compare.r \
|
||||||
|
double-float-compare.r
|
||||||
|
|
||||||
|
fail_build_errors=
|
||||||
|
|
||||||
test_defspace_src=\
|
test_defspace_src=\
|
||||||
tw-defspace.c tw-diagnostic.c tw-strpool.c
|
tw-defspace.c tw-diagnostic.c tw-strpool.c
|
||||||
|
|
||||||
TESTS=$(test_bins) $(test_progs_dat:.dat=.run)
|
TESTS=\
|
||||||
XFAIL_TESTS=$(fail_bins) $(fail_progs_dat:.dat=.run)
|
$(test_bins) \
|
||||||
|
$(test_progs_dat:.dat=.run) \
|
||||||
|
$(test_build_errors:.r=.run)
|
||||||
|
XFAIL_TESTS=\
|
||||||
|
$(fail_bins) \
|
||||||
|
$(fail_progs_dat:.dat=.run) \
|
||||||
|
$(fail_build_errors:.r=.run)
|
||||||
|
|
||||||
check_PROGRAMS=test-harness $(test_progs_dat) $(test_bins)
|
check_PROGRAMS=test-harness $(test_progs_dat) $(test_bins)
|
||||||
|
|
||||||
|
@ -121,6 +133,12 @@ double.run: Makefile build-run
|
||||||
include ./$(DEPDIR)/double.Qo # am--include-marker
|
include ./$(DEPDIR)/double.Qo # am--include-marker
|
||||||
r_depfiles_remade += ./$(DEPDIR)/double.Qo
|
r_depfiles_remade += ./$(DEPDIR)/double.Qo
|
||||||
|
|
||||||
|
double-int-compare.run$(EXEEXT): double-int-compare.r Makefile build-compile-fail-run
|
||||||
|
$(srcdir)/build-compile-fail-run $@ $(QFCC) $(QCFLAGS) $<
|
||||||
|
|
||||||
|
double-float-compare.run$(EXEEXT): double-float-compare.r Makefile build-compile-fail-run
|
||||||
|
$(srcdir)/build-compile-fail-run $@ $(QFCC) $(QCFLAGS) $<
|
||||||
|
|
||||||
enum_dat_SOURCES=enum.r
|
enum_dat_SOURCES=enum.r
|
||||||
enum_obj=$(enum_dat_SOURCES:.r=.qfo)
|
enum_obj=$(enum_dat_SOURCES:.r=.qfo)
|
||||||
enum.dat$(EXEEXT): $(enum_obj) $(QFCC_DEP)
|
enum.dat$(EXEEXT): $(enum_obj) $(QFCC_DEP)
|
||||||
|
|
15
tools/qfcc/test/build-compile-fail-run
Executable file
15
tools/qfcc/test/build-compile-fail-run
Executable file
|
@ -0,0 +1,15 @@
|
||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
script=$1
|
||||||
|
shift
|
||||||
|
|
||||||
|
cat > $script <<EOF
|
||||||
|
#! /bin/sh
|
||||||
|
# compile must fail
|
||||||
|
$@
|
||||||
|
if test \$? != 1; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
EOF
|
||||||
|
chmod +x $script
|
7
tools/qfcc/test/double-float-compare.r
Normal file
7
tools/qfcc/test/double-float-compare.r
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
double a;
|
||||||
|
float b;
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
int x = a == b;
|
||||||
|
return 1; // test fails if compile succeeds
|
||||||
|
}
|
7
tools/qfcc/test/double-int-compare.r
Normal file
7
tools/qfcc/test/double-int-compare.r
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
double a;
|
||||||
|
int b;
|
||||||
|
int main ()
|
||||||
|
{
|
||||||
|
int x = a == b;
|
||||||
|
return 1; // test fails if compile succeeds
|
||||||
|
}
|
|
@ -12,7 +12,46 @@ test_format ()
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
type_pun.d = M_PI;
|
type_pun.d = M_PI;
|
||||||
printf ("%g %08x%08x\n", type_pun.d, type_pun.i[1], type_pun.i[0]);
|
printf ("%g %08x%08x\n", type_pun.d, type_pun.i[1], type_pun.i[0]);
|
||||||
//printf ("%08x%08x\n", type_pun.i[1], type_pun.i[0]);
|
// this will fail on big-endian systems
|
||||||
|
fail = type_pun.i[0] != 0x54442d18 || type_pun.i[1] != 0x400921fb;
|
||||||
|
return fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
test_constant ()
|
||||||
|
{
|
||||||
|
int fail = 0;
|
||||||
|
double a, b, c, d, e;
|
||||||
|
a = 1;
|
||||||
|
b = 2.0;
|
||||||
|
c = 3.2f;
|
||||||
|
d = 3.2d;
|
||||||
|
e = 3.2;
|
||||||
|
printf ("%.17g %.17g %.17g %.17g %.17g\n", a, b, c, d, e);
|
||||||
|
// this will fail on big-endian systems
|
||||||
|
fail |= c == d; // 3.2 is not exactly representable, so must be different
|
||||||
|
fail |= c == e; // 3.2 is not exactly representable, so must be different
|
||||||
|
fail |= d != e; // 3.2d and 3.2 are both double, so must be the same
|
||||||
|
return fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
test_ops ()
|
||||||
|
{
|
||||||
|
int fail = 0;
|
||||||
|
double a = 6.25, b = 2.375;
|
||||||
|
double c;
|
||||||
|
|
||||||
|
c = a + b;
|
||||||
|
fail |= c != 8.625;
|
||||||
|
c = a - b;
|
||||||
|
fail |= c != 3.875;
|
||||||
|
c = a * b;
|
||||||
|
fail |= c != 14.84375;
|
||||||
|
c = a / b;
|
||||||
|
fail |= c != 50d/19d;
|
||||||
|
c = a % b;
|
||||||
|
fail |= c != 1.5;
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,5 +60,7 @@ main ()
|
||||||
{
|
{
|
||||||
int fail = 0;
|
int fail = 0;
|
||||||
fail |= test_format ();
|
fail |= test_format ();
|
||||||
|
fail |= test_constant ();
|
||||||
|
fail |= test_ops ();
|
||||||
return fail;
|
return fail;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue