aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/Makefile95
-rw-r--r--tests/abitest.c60
-rw-r--r--tests/tcctest.c121
-rw-r--r--tests/tests2/03_struct.c2
-rw-r--r--tests/tests2/30_hanoi.c2
-rw-r--r--tests/tests2/31_args.c2
-rw-r--r--tests/tests2/31_args.expect11
-rw-r--r--tests/tests2/46_grep.c23
-rw-r--r--tests/tests2/46_grep.expect3
-rw-r--r--tests/tests2/56_btype_excess-1.c1
-rw-r--r--tests/tests2/56_btype_excess-1.expect1
-rw-r--r--tests/tests2/57_btype_excess-2.c1
-rw-r--r--tests/tests2/57_btype_excess-2.expect1
-rw-r--r--tests/tests2/58_function_redefinition.c9
-rw-r--r--tests/tests2/58_function_redefinition.expect1
-rw-r--r--tests/tests2/59_function_array.c1
-rw-r--r--tests/tests2/59_function_array.expect1
-rw-r--r--tests/tests2/60_enum_redefinition.c4
-rw-r--r--tests/tests2/60_enum_redefinition.expect1
-rw-r--r--tests/tests2/61_undefined_enum.c1
-rw-r--r--tests/tests2/61_undefined_enum.expect1
-rw-r--r--tests/tests2/62_enumerator_redefinition.c4
-rw-r--r--tests/tests2/62_enumerator_redefinition.expect1
-rw-r--r--tests/tests2/63_local_enumerator_redefinition.c14
-rw-r--r--tests/tests2/63_local_enumerator_redefinition.expect0
-rw-r--r--tests/tests2/64_macro_nesting.c10
-rw-r--r--tests/tests2/64_macro_nesting.expect1
-rw-r--r--tests/tests2/65_macro_concat_start.c2
-rw-r--r--tests/tests2/65_macro_concat_start.expect1
-rw-r--r--tests/tests2/66_macro_concat_end.c2
-rw-r--r--tests/tests2/66_macro_concat_end.expect1
-rw-r--r--tests/tests2/67_macro_concat.c14
-rw-r--r--tests/tests2/67_macro_concat.expect2
-rw-r--r--tests/tests2/Makefile56
34 files changed, 360 insertions, 90 deletions
diff --git a/tests/Makefile b/tests/Makefile
index 08dfa42..e3824ba 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -5,7 +5,7 @@
TOP = ..
include $(TOP)/Makefile
SRCDIR = $(top_srcdir)/tests
-VPATH = $(SRCDIR)
+VPATH = $(SRCDIR) $(top_srcdir)
# what tests to run
TESTS = \
@@ -13,24 +13,30 @@ TESTS = \
hello-run \
libtest \
test3 \
+ $(BTESTS) \
abitest \
vla_test-run \
moretests
+BTESTS = test1b test3b btest
+
+ifdef CONFIG_CROSS
+ TESTS += hello-cross
+endif
+
# test4 -- problem with -static
# asmtest -- minor differences with gcc
# btest -- works on i386 (including win32)
-# test3 -- win32 does not know how to printf long doubles
# bounds-checking is supported only on i386
ifneq ($(ARCH),i386)
- TESTS := $(filter-out btest,$(TESTS))
+ TESTS := $(filter-out $(BTESTS),$(TESTS))
endif
ifdef CONFIG_WIN32
- TESTS := $(filter-out test3,$(TESTS))
+ TESTS := w32-prep $(filter-out $(BTESTS),$(TESTS))
endif
ifeq ($(TARGETOS),Darwin)
- TESTS := $(filter-out hello-exe test3 btest,$(TESTS))
+ TESTS := $(filter-out hello-exe test3 $(BTESTS),$(TESTS))
endif
ifeq ($(ARCH),i386)
else ifneq ($(ARCH),x86-64)
@@ -52,6 +58,7 @@ TCCFLAGS = -B$(TOP) -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/include
ifdef CONFIG_WIN32
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir) -I$(top_srcdir)/include -I$(TOP) -L$(TOP)
endif
+XTCCFLAGS = -B$(TOP) -B$(top_srcdir)/win32 -I$(TOP) -I$(top_srcdir) -I$(top_srcdir)/include
TCC = $(TOP)/tcc $(TCCFLAGS)
RUN_TCC = $(NATIVE_DEFINES) -DONE_SOURCE -run $(top_srcdir)/tcc.c $(TCCFLAGS)
@@ -69,6 +76,15 @@ hello-exe: ../examples/ex1.c
@echo ------------ $@ ------------
$(TCC) $< -o hello$(EXESUF) || ($(TOP)/tcc -vv; exit 1) && ./hello$(EXESUF)
+hello-cross: ../examples/ex1.c
+ @echo ------------ $@ ------------
+ for XTCC in $(PROGS_CROSS) ; \
+ do echo -n "Test of $$XTCC... "; \
+ out=$$($(TOP)/$$XTCC $(XTCCFLAGS) -c $< 2>&1); \
+ test $$? -ne 0 && { echo "Failed\n$$out\n" ; $(TOP)/$$XTCC -vv; exit 1; } ; \
+ echo "Success"; \
+ done
+
hello-run: ../examples/ex1.c
@echo ------------ $@ ------------
$(TCC) -run $<
@@ -84,48 +100,52 @@ moretests:
@echo ------------ $@ ------------
$(MAKE) -C tests2
-# test.ref - generate using gcc
-# copy only tcclib.h so GCC's stddef and stdarg will be used
+w32-prep:
+ cp ../libtcc1.a ../lib
+
+# test.ref - generate using cc
test.ref: tcctest.c
- gcc -o tcctest.gcc $< -I$(top_srcdir) $(CPPFLAGS) -w $(CFLAGS) $(NATIVE_DEFINES) -std=gnu99 -O0 -fno-omit-frame-pointer $(LDFLAGS)
- ./tcctest.gcc > $@
+ $(CC) -o tcctest.cc $< -I$(top_srcdir) $(CPPFLAGS) -w $(CFLAGS) $(NATIVE_DEFINES) -std=gnu99 -O0 -fno-omit-frame-pointer $(LDFLAGS)
+ ./tcctest.cc > $@
# auto test
-test1: test.ref
+test1 test1b: tcctest.c test.ref
@echo ------------ $@ ------------
- $(TCC) -run $(SRCDIR)/tcctest.c > test.out1
- @if diff -u test.ref test.out1 ; then echo "Auto Test OK"; fi
+ $(TCC) -run $< > test.out1
+ @diff -u test.ref test.out1 && echo "Auto Test OK"
# iterated test2 (compile tcc then compile tcctest.c !)
-test2: test.ref
+test2 test2b: tcctest.c test.ref
@echo ------------ $@ ------------
- $(TCC) $(RUN_TCC) $(RUN_TCC) -run $(SRCDIR)/tcctest.c > test.out2
- @if diff -u test.ref test.out2 ; then echo "Auto Test2 OK"; fi
+ $(TCC) $(RUN_TCC) $(RUN_TCC) -run $< > test.out2
+ @diff -u test.ref test.out2 && echo "Auto Test2 OK"
# iterated test3 (compile tcc then compile tcc then compile tcctest.c !)
-test3: test.ref
+test3 test3b: tcctest.c test.ref
@echo ------------ $@ ------------
- $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run $(SRCDIR)/tcctest.c > test.out3
- @if diff -u test.ref test.out3 ; then echo "Auto Test3 OK"; fi
+ $(TCC) $(RUN_TCC) $(RUN_TCC) $(RUN_TCC) -run $< > test.out3
+ @diff -u test.ref test.out3 && echo "Auto Test3 OK"
+
+test%b : TCCFLAGS += -b
# binary output test
-test4: test.ref
+test4: tcctest.c test.ref
@echo ------------ $@ ------------
# object + link output
- $(TCC) -c -o tcctest3.o $(SRCDIR)/tcctest.c
+ $(TCC) -c -o tcctest3.o $<
$(TCC) -o tcctest3 tcctest3.o
./tcctest3 > test3.out
@if diff -u test.ref test3.out ; then echo "Object Auto Test OK"; fi
# dynamic output
- $(TCC) -o tcctest1 $(SRCDIR)/tcctest.c
+ $(TCC) -o tcctest1 $<
./tcctest1 > test1.out
@if diff -u test.ref test1.out ; then echo "Dynamic Auto Test OK"; fi
# dynamic output + bound check
- $(TCC) -b -o tcctest4 $(SRCDIR)/tcctest.c
+ $(TCC) -b -o tcctest4 $<
./tcctest4 > test4.out
@if diff -u test.ref test4.out ; then echo "BCheck Auto Test OK"; fi
# static output
- $(TCC) -static -o tcctest2 $(SRCDIR)/tcctest.c
+ $(TCC) -static -o tcctest2 $<
./tcctest2 > test2.out
@if diff -u test.ref test2.out ; then echo "Static Auto Test OK"; fi
@@ -137,15 +157,15 @@ btest: boundtest.c
@echo ------------ $@ ------------
@for i in $(BOUNDS_OK); do \
echo ; echo --- boundtest $$i ---; \
- if $(TCC) -b -run boundtest.c $$i ; then \
- echo succeded as expected; \
+ if $(TCC) -b -run $< $$i ; then \
+ echo succeeded as expected; \
else\
echo Failed positive test $$i ; exit 1 ; \
fi ;\
done ;\
for i in $(BOUNDS_FAIL); do \
echo ; echo --- boundtest $$i ---; \
- if $(TCC) -b -run boundtest.c $$i ; then \
+ if $(TCC) -b -run $< $$i ; then \
echo Failed negative test $$i ; exit 1 ;\
else\
echo failed as expected; \
@@ -161,12 +181,12 @@ speedtest: ex2 ex3
time ./ex3 35
time $(TCC) -run $(top_srcdir)/examples/ex3.c 35
-weaktest: test.ref
- $(TCC) -c tcctest.c -o weaktest.tcc.o $(CPPFLAGS) $(CFLAGS)
- $(CC) -c tcctest.c -o weaktest.gcc.o -I. $(CPPFLAGS) -w $(CFLAGS)
+weaktest: tcctest.c test.ref
+ $(TCC) -c $< -o weaktest.tcc.o $(CPPFLAGS) $(CFLAGS)
+ $(CC) -c $< -o weaktest.cc.o -I. $(CPPFLAGS) -w $(CFLAGS)
objdump -t weaktest.tcc.o | grep ' w ' | sed -e 's/.* \([a-zA-Z0-9_]*\)$$/\1/' | LC_ALL=C sort > weaktest.tcc.o.txt
- objdump -t weaktest.gcc.o | grep ' w ' | sed -e 's/.* \([a-zA-Z0-9_]*\)$$/\1/' | LC_ALL=C sort > weaktest.gcc.o.txt
- diff weaktest.gcc.o.txt weaktest.tcc.o.txt && echo "Weak Auto Test OK"
+ objdump -t weaktest.cc.o | grep ' w ' | sed -e 's/.* \([a-zA-Z0-9_]*\)$$/\1/' | LC_ALL=C sort > weaktest.cc.o.txt
+ diff weaktest.cc.o.txt weaktest.tcc.o.txt && echo "Weak Auto Test OK"
ex%: $(top_srcdir)/examples/ex%.c
$(CC) -o $@ $< $(CPPFLAGS) $(CFLAGS) $(LDFLAGS)
@@ -187,8 +207,8 @@ asmtest: asmtest.ref
abitest-cc$(EXESUF): abitest.c $(top_builddir)/$(LIBTCC)
$(CC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS) -I$(top_srcdir)
-abitest-tcc$(EXESUF): abitest.c $(top_builddir)/$(LIBTCC)
- $(TCC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) $(LIBS) $(LINK_LIBTCC) $(LDFLAGS) -I$(top_srcdir)
+abitest-tcc$(EXESUF): abitest.c libtcc.c
+ $(TCC) -o $@ $^ $(CPPFLAGS) $(CFLAGS) $(NATIVE_DEFINES) -DONE_SOURCE $(LIBS) $(LDFLAGS) -I$(top_srcdir)
abitest: abitest-cc$(EXESUF) abitest-tcc$(EXESUF)
@echo ------------ $@ ------------
@@ -219,8 +239,7 @@ cache: tcc_g
# clean
clean:
$(MAKE) -C tests2 $@
- rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.gcc *.exe \
- hello libtcc_test tcctest[1234] ex? tcc_g tcclib.h
-
-Makefile: $(SRCDIR)/Makefile
- cp $< $@
+ rm -vf *~ *.o *.a *.bin *.i *.ref *.out *.out? *.out?b *.cc \
+ *-cc *-tcc *.exe \
+ hello libtcc_test vla_test tcctest[1234] ex? tcc_g tcclib.h \
+ ../lib/libtcc1.a
diff --git a/tests/abitest.c b/tests/abitest.c
index 7b12144..3ad707a 100644
--- a/tests/abitest.c
+++ b/tests/abitest.c
@@ -88,7 +88,7 @@ static int ret_2float_test_callback(void *ptr) {
ret_2float_test_type a = {10, 35};
ret_2float_test_type r;
r = f(a);
- return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
+ return ((r.x == a.x*5) && (r.y == a.y*3) && (f(a).x == a.x*5) && (f(a).y == a.y*3)) ? 0 : -1;
}
static int ret_2float_test(void) {
@@ -116,7 +116,7 @@ static int ret_2double_test_callback(void *ptr) {
ret_2double_test_type a = {10, 35};
ret_2double_test_type r;
r = f(a);
- return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
+ return ((r.x == a.x*5) && (r.y == a.y*3) && (f(a).x == a.x*5) && (f(a).y == a.y*3)) ? 0 : -1;
}
static int ret_2double_test(void) {
@@ -130,6 +130,50 @@ static int ret_2double_test(void) {
return run_callback(src, ret_2double_test_callback);
}
+typedef struct ret_longdouble_test_type_s2 {LONG_DOUBLE x;} ret_longdouble_test_type;
+typedef ret_longdouble_test_type (*ret_longdouble_test_function_type) (ret_longdouble_test_type);
+
+static int ret_longdouble_test_callback2(void *ptr) {
+ ret_longdouble_test_function_type f = (ret_longdouble_test_function_type)ptr;
+ ret_longdouble_test_type a = {10};
+ ret_longdouble_test_type r;
+ r = f(a);
+ return ((r.x == a.x*5) && (f(a).x == a.x*5)) ? 0 : -1;
+}
+
+static int ret_longdouble_test2(void) {
+ const char *src =
+ "typedef struct ret_longdouble_test_type_s2 {long double x;} ret_longdouble_test_type;"
+ "ret_longdouble_test_type f(ret_longdouble_test_type a) {\n"
+ " ret_longdouble_test_type r = {a.x*5};\n"
+ " return r;\n"
+ "}\n";
+
+ return run_callback(src, ret_longdouble_test_callback2);
+}
+
+typedef struct ret_longlong_test_type_s2 {int x[4];} ret_longlong_test_type;
+typedef ret_longlong_test_type (*ret_longlong_test_function_type) (ret_longlong_test_type);
+
+static int ret_longlong_test_callback2(void *ptr) {
+ ret_longlong_test_function_type f = (ret_longlong_test_function_type)ptr;
+ ret_longlong_test_type a = {{10,11,12,13}};
+ ret_longlong_test_type r;
+ r = f(a);
+ return ((r.x[2] == a.x[2]*5) && (f(a).x[2] == a.x[2]*5)) ? 0 : -1;
+}
+
+static int ret_longlong_test2(void) {
+ const char *src =
+ "typedef struct ret_longlong_test_type_s2 {int x[4];} ret_longlong_test_type;"
+ "ret_longlong_test_type f(ret_longlong_test_type a) {\n"
+ " ret_longlong_test_type r = {.x[2] = a.x[2]*5};\n"
+ " return r;\n"
+ "}\n";
+
+ return run_callback(src, ret_longlong_test_callback2);
+}
+
/*
* reg_pack_test: return a small struct which should be packed into
* registers (Win32) during return.
@@ -142,7 +186,7 @@ static int reg_pack_test_callback(void *ptr) {
reg_pack_test_type a = {10, 35};
reg_pack_test_type r;
r = f(a);
- return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
+ return ((r.x == a.x*5) && (r.y == a.y*3) && (f(a).x == a.x*5) && (f(a).y == a.y*3)) ? 0 : -1;
}
static int reg_pack_test(void) {
@@ -168,7 +212,7 @@ static int reg_pack_longlong_test_callback(void *ptr) {
reg_pack_longlong_test_type a = {10, 35};
reg_pack_longlong_test_type r;
r = f(a);
- return ((r.x == a.x*5) && (r.y == a.y*3)) ? 0 : -1;
+ return ((r.x == a.x*5) && (r.y == a.y*3) && (f(a).x == a.x*5) && (f(a).y == a.y*3)) ? 0 : -1;
}
static int reg_pack_longlong_test(void) {
@@ -248,7 +292,7 @@ static int two_member_union_test_callback(void *ptr) {
two_member_union_test_type a, b;
a.x = 34;
b = f(a);
- return (b.x == a.x*2) ? 0 : -1;
+ return ((b.x == a.x*2) && (f(a).x == a.x*2)) ? 0 : -1;
}
static int two_member_union_test(void) {
@@ -339,8 +383,8 @@ static int stdarg_test(void) {
"#include <stdarg.h>\n"
"typedef struct {long long a, b, c;} stdarg_test_struct_type;\n"
"void f(int n_int, int n_float, int n_struct, ...) {\n"
- " int i, ti;\n"
- " double td;\n"
+ " int i, ti = 0;\n"
+ " double td = 0.0;\n"
" stdarg_test_struct_type ts = {0,0,0}, tmp;\n"
" va_list ap;\n"
" va_start(ap, n_struct);\n"
@@ -441,6 +485,8 @@ int main(int argc, char **argv) {
RUN_TEST(ret_longdouble_test);
RUN_TEST(ret_2float_test);
RUN_TEST(ret_2double_test);
+ RUN_TEST(ret_longlong_test2);
+ RUN_TEST(ret_longdouble_test2);
RUN_TEST(reg_pack_test);
RUN_TEST(reg_pack_longlong_test);
RUN_TEST(sret_test);
diff --git a/tests/tcctest.c b/tests/tcctest.c
index c5a3e73..cc8ffd8 100644
--- a/tests/tcctest.c
+++ b/tests/tcctest.c
@@ -59,6 +59,7 @@
#include "tcclib.h"
+void intdiv_test();
void string_test();
void expr_test();
void macro_test();
@@ -167,6 +168,71 @@ int qq(int x)
#define wq_spin_lock spin_lock
#define TEST2() wq_spin_lock(a)
+#define UINT_MAX ((unsigned) -1)
+
+void intdiv_test(void)
+{
+ printf("18/21=%u\n", 18/21);
+ printf("18%21=%u\n", 18%21);
+ printf("41/21=%u\n", 41/21);
+ printf("41%21=%u\n", 41%21);
+ printf("42/21=%u\n", 42/21);
+ printf("42%21=%u\n", 42%21);
+ printf("43/21=%u\n", 43/21);
+ printf("43%21=%u\n", 43%21);
+ printf("126/21=%u\n", 126/21);
+ printf("12%/21=%u\n", 126%21);
+ printf("131/21=%u\n", 131/21);
+ printf("131%21=%u\n", 131%21);
+ printf("(UINT_MAX/2+3)/2=%u\n", (UINT_MAX/2+3)/2);
+ printf("(UINT_MAX/2+3)%2=%u\n", (UINT_MAX/2+3)%2);
+
+ printf("18/-21=%u\n", 18/-21);
+ printf("18%-21=%u\n", 18%-21);
+ printf("41/-21=%u\n", 41/-21);
+ printf("41%-21=%u\n", 41%-21);
+ printf("42/-21=%u\n", 42/-21);
+ printf("42%-21=%u\n", 42%-21);
+ printf("43/-21=%u\n", 43/-21);
+ printf("43%-21=%u\n", 43%-21);
+ printf("126/-21=%u\n", 126/-21);
+ printf("12%/-21=%u\n", 126%-21);
+ printf("131/-21=%u\n", 131/-21);
+ printf("131%-21=%u\n", 131%-21);
+ printf("(UINT_MAX/2+3)/-2=%u\n", (UINT_MAX/2+3)/-2);
+ printf("(UINT_MAX/2+3)%-2=%u\n", (UINT_MAX/2+3)%-2);
+
+ printf("-18/21=%u\n", -18/21);
+ printf("-18%21=%u\n", -18%21);
+ printf("-41/21=%u\n", -41/21);
+ printf("-41%21=%u\n", -41%21);
+ printf("-42/21=%u\n", -42/21);
+ printf("-42%21=%u\n", -42%21);
+ printf("-43/21=%u\n", -43/21);
+ printf("-43%21=%u\n", -43%21);
+ printf("-126/21=%u\n", -126/21);
+ printf("-12%/21=%u\n", -126%21);
+ printf("-131/21=%u\n", -131/21);
+ printf("-131%21=%u\n", -131%21);
+ printf("-(UINT_MAX/2+3)/2=%u\n", (0-(UINT_MAX/2+3))/2);
+ printf("-(UINT_MAX/2+3)%2=%u\n", (0-(UINT_MAX/2+3))%2);
+
+ printf("-18/-21=%u\n", -18/-21);
+ printf("-18%-21=%u\n", -18%-21);
+ printf("-41/-21=%u\n", -41/-21);
+ printf("-41%-21=%u\n", -41%-21);
+ printf("-42/-21=%u\n", -42/-21);
+ printf("-42%-21=%u\n", -42%-21);
+ printf("-43/-21=%u\n", -43/-21);
+ printf("-43%-21=%u\n", -43%-21);
+ printf("-126/-21=%u\n", -126/-21);
+ printf("-12%/-21=%u\n", -126%-21);
+ printf("-131/-21=%u\n", -131/-21);
+ printf("-131%-21=%u\n", -131%-21);
+ printf("-(UINT_MAX/2+3)/-2=%u\n", (0-(UINT_MAX/2+3))/-2);
+ printf("-(UINT_MAX/2+3)%-2=%u\n", (0-(UINT_MAX/2+3))%-2);
+}
+
void macro_test(void)
{
printf("macro:\n");
@@ -619,6 +685,7 @@ int main(int argc, char **argv)
math_cmp_test();
callsave_test();
builtin_frame_address_test();
+ intdiv_test();
return 0;
}
@@ -1603,21 +1670,32 @@ void prefix ## fcast(type a)\
double da;\
LONG_DOUBLE la;\
int ia;\
+ long long llia;\
unsigned int ua;\
+ unsigned long long llua;\
type b;\
fa = a;\
da = a;\
la = a;\
printf("ftof: %f %f %Lf\n", fa, da, la);\
ia = (int)a;\
+ llia = (long long)a;\
+ a = (a >= 0) ? a : -a;\
ua = (unsigned int)a;\
- printf("ftoi: %d %u\n", ia, ua);\
+ llua = (unsigned long long)a;\
+ printf("ftoi: %d %u %lld %llu\n", ia, ua, llia, llua);\
ia = -1234;\
ua = 0x81234500;\
+ llia = -0x123456789012345LL;\
+ llua = 0xf123456789012345LLU;\
b = ia;\
printf("itof: " fmt "\n", b);\
b = ua;\
printf("utof: " fmt "\n", b);\
+ b = llia;\
+ printf("lltof: " fmt "\n", b);\
+ b = llua;\
+ printf("ulltof: " fmt "\n", b);\
}\
\
float prefix ## retf(type a) { return a; }\
@@ -1632,6 +1710,35 @@ void prefix ## call(void)\
printf("strto%s: %f\n", #prefix, (double)strto ## prefix("1.2", NULL));\
}\
\
+void prefix ## signed_zeros(void) \
+{\
+ type x = 0.0, y = -0.0, n, p;\
+ if (x == y)\
+ printf ("Test 1.0 / x != 1.0 / y returns %d (should be 1).\n",\
+ 1.0 / x != 1.0 / y);\
+ else\
+ printf ("x != y; this is wrong!\n");\
+\
+ n = -x;\
+ if (x == n)\
+ printf ("Test 1.0 / x != 1.0 / -x returns %d (should be 1).\n",\
+ 1.0 / x != 1.0 / n);\
+ else\
+ printf ("x != -x; this is wrong!\n");\
+\
+ p = +y;\
+ if (x == p)\
+ printf ("Test 1.0 / x != 1.0 / +y returns %d (should be 1).\n",\
+ 1.0 / x != 1.0 / p);\
+ else\
+ printf ("x != +y; this is wrong!\n");\
+ p = -y;\
+ if (x == p)\
+ printf ("Test 1.0 / x != 1.0 / -y returns %d (should be 0).\n",\
+ 1.0 / x != 1.0 / p);\
+ else\
+ printf ("x != -y; this is wrong!\n");\
+}\
void prefix ## test(void)\
{\
printf("testing '%s'\n", #typename);\
@@ -1641,6 +1748,7 @@ void prefix ## test(void)\
prefix ## fcast(234.6);\
prefix ## fcast(-2334.6);\
prefix ## call();\
+ prefix ## signed_zeros();\
}
FTEST(f, float, float, "%f")
@@ -2113,7 +2221,7 @@ void old_style_function(void)
void alloca_test()
{
-#if defined __i386__ || defined __x86_64__
+#if defined __i386__ || defined __x86_64__ || defined __arm__
char *p = alloca(16);
strcpy(p,"123456789012345");
printf("alloca: p is %s\n", p);
@@ -2146,7 +2254,7 @@ void c99_vla_test(int size1, int size2)
printf("%s\n", (sizeof tab1 == size1 * size2 * 2 * sizeof(int)) ? "PASSED" : "FAILED");
tab1_ptr = tab1;
tab2_ptr = tab2;
- printf("Test C99 VLA 2 (ptrs substract): ");
+ printf("Test C99 VLA 2 (ptrs subtract): ");
printf("%s\n", (tab2 - tab1 == (tab2_ptr - tab1_ptr) / (sizeof(int) * 2)) ? "PASSED" : "FAILED");
printf("Test C99 VLA 3 (ptr add): ");
printf("%s\n", &tab1[5][1] == (tab1_ptr + (5 * 2 + 1) * sizeof(int)) ? "PASSED" : "FAILED");
@@ -2686,7 +2794,7 @@ double get100 () { return 100.0; }
void callsave_test(void)
{
-#if defined __i386__ || defined __x86_64__
+#if defined __i386__ || defined __x86_64__ || defined __arm__
int i, s; double *d; double t;
s = sizeof (double);
printf ("callsavetest: %d\n", s);
@@ -2715,16 +2823,17 @@ void bfa2(ptrdiff_t str_offset)
void bfa1(ptrdiff_t str_offset)
{
printf("bfa1: %s\n", (char *)__builtin_frame_address(1) + str_offset);
-#if defined(__arm__) && !defined(__GNUC__)
bfa2(str_offset);
-#endif
}
void builtin_frame_address_test(void)
{
+/* builtin_frame_address fails on ARM with gcc which make test3 fail */
+#ifndef __arm__
char str[] = "__builtin_frame_address";
char *fp0 = __builtin_frame_address(0);
printf("str: %s\n", str);
bfa1(str-fp0);
+#endif
}
diff --git a/tests/tests2/03_struct.c b/tests/tests2/03_struct.c
index df0d3e7..c5d48c5 100644
--- a/tests/tests2/03_struct.c
+++ b/tests/tests2/03_struct.c
@@ -6,7 +6,7 @@ struct fred
int natasha;
};
-void main()
+int main()
{
struct fred bloggs;
diff --git a/tests/tests2/30_hanoi.c b/tests/tests2/30_hanoi.c
index b1a1181..7c0893b 100644
--- a/tests/tests2/30_hanoi.c
+++ b/tests/tests2/30_hanoi.c
@@ -68,7 +68,7 @@ void PrintAll()
/* Returns the value moved (not used.) */
int Move(int *source, int *dest)
{
- int i,j;
+ int i = 0, j = 0;
while (i<N && (source[i])==0) i++;
while (j<N && (dest[j])==0) j++;
diff --git a/tests/tests2/31_args.c b/tests/tests2/31_args.c
index 275f8cf..dcafed5 100644
--- a/tests/tests2/31_args.c
+++ b/tests/tests2/31_args.c
@@ -5,7 +5,7 @@ int main(int argc, char **argv)
int Count;
printf("hello world %d\n", argc);
- for (Count = 0; Count < argc; Count++)
+ for (Count = 1; Count < argc; Count++)
printf("arg %d: %s\n", Count, argv[Count]);
return 0;
diff --git a/tests/tests2/31_args.expect b/tests/tests2/31_args.expect
index c392b67..8c60bfc 100644
--- a/tests/tests2/31_args.expect
+++ b/tests/tests2/31_args.expect
@@ -1,7 +1,6 @@
hello world 6
-arg 0: 31_args.c
-arg 1: -
-arg 2: arg1
-arg 3: arg2
-arg 4: arg3
-arg 5: arg4
+arg 1: arg1
+arg 2: arg2
+arg 3: arg3
+arg 4: arg4
+arg 5: arg5
diff --git a/tests/tests2/46_grep.c b/tests/tests2/46_grep.c
index 5f52220..3123bc3 100644
--- a/tests/tests2/46_grep.c
+++ b/tests/tests2/46_grep.c
@@ -15,6 +15,7 @@
* privileges were granted by DECUS.
*/
#include <stdio.h>
+#include <stdlib.h>
/*
* grep
@@ -25,14 +26,13 @@
* See below for more information.
*/
-#if 0
char *documentation[] = {
"grep searches a file for a given pattern. Execute by",
" grep [flags] regular_expression file_list\n",
- "Flags are single characters preceeded by '-':",
+ "Flags are single characters preceded by '-':",
" -c Only a count of matching lines is printed",
" -f Print file name for matching lines switch, see below",
- " -n Each line is preceeded by its line number",
+ " -n Each line is preceded by its line number",
" -v Only print non-matching lines\n",
"The file_list is a list of files (wildcards are acceptable on RSX modes).",
"\nThe file name is normally printed if there is a file given.",
@@ -54,10 +54,10 @@ char *patdoc[] = {
"':n' \":n\" matches alphanumerics, \": \" matches spaces, tabs, and",
"': ' other control characters, such as new-line.",
"'*' An expression followed by an asterisk matches zero or more",
- " occurrances of that expression: \"fo*\" matches \"f\", \"fo\"",
+ " occurrences of that expression: \"fo*\" matches \"f\", \"fo\"",
" \"foo\", etc.",
"'+' An expression followed by a plus sign matches one or more",
- " occurrances of that expression: \"fo+\" matches \"fo\", etc.",
+ " occurrences of that expression: \"fo+\" matches \"fo\", etc.",
"'-' An expression followed by a minus sign optionally matches",
" the expression.",
"'[]' A string enclosed in square brackets matches any character in",
@@ -70,7 +70,6 @@ char *patdoc[] = {
" [a-z] matches alphabetics, while [z-a] never matches.",
"The concatenation of regular expressions is a regular expression.",
0};
-#endif
#define LMAX 512
#define PMAX 256
@@ -97,6 +96,10 @@ char *pp, lbuf[LMAX], pbuf[PMAX];
char *cclass();
char *pmatch();
+void store(int);
+void error(char *);
+void badpat(char *, char *, char *);
+int match(void);
/*** Display a file name *******************************/
@@ -153,7 +156,7 @@ void compile(char *source)
o == STAR ||
o == PLUS ||
o == MINUS)
- badpat("Illegal occurrance op.", source, s);
+ badpat("Illegal occurrence op.", source, s);
store(ENDPAT);
store(ENDPAT);
spp = pp; /* Save pattern end */
@@ -300,7 +303,7 @@ void badpat(char *message, char *source, char *stop)
/* char *stop; // Pattern end */
{
fprintf(stderr, "-GREP-E-%s, pattern is\"%s\"\n", message, source);
- fprintf(stderr, "-GREP-E-Stopped at byte %d, '%c'\n",
+ fprintf(stderr, "-GREP-E-Stopped at byte %ld, '%c'\n",
stop-source, stop[-1]);
error("?GREP-E-Bad pattern\n");
}
@@ -338,7 +341,7 @@ void grep(FILE *fp, char *fn)
}
/*** Match line (lbuf) with pattern (pbuf) return 1 if match ***/
-void match()
+int match()
{
char *l; /* Line pointer */
@@ -368,7 +371,7 @@ char *pmatch(char *line, char *pattern)
p = pattern;
while ((op = *p++) != ENDPAT) {
if (debug > 1)
- printf("byte[%d] = 0%o, '%c', op = 0%o\n",
+ printf("byte[%ld] = 0%o, '%c', op = 0%o\n",
l-line, *l, *l, op);
switch(op) {
diff --git a/tests/tests2/46_grep.expect b/tests/tests2/46_grep.expect
new file mode 100644
index 0000000..e8a6791
--- /dev/null
+++ b/tests/tests2/46_grep.expect
@@ -0,0 +1,3 @@
+File 46_grep.c:
+/* vim: set expandtab ts=4 sw=3 sts=3 tw=80 :*/
+
diff --git a/tests/tests2/56_btype_excess-1.c b/tests/tests2/56_btype_excess-1.c
new file mode 100644
index 0000000..06eabe7
--- /dev/null
+++ b/tests/tests2/56_btype_excess-1.c
@@ -0,0 +1 @@
+struct A {} int i;
diff --git a/tests/tests2/56_btype_excess-1.expect b/tests/tests2/56_btype_excess-1.expect
new file mode 100644
index 0000000..4e6d2d7
--- /dev/null
+++ b/tests/tests2/56_btype_excess-1.expect
@@ -0,0 +1 @@
+56_btype_excess-1.c:1: error: too many basic types
diff --git a/tests/tests2/57_btype_excess-2.c b/tests/tests2/57_btype_excess-2.c
new file mode 100644
index 0000000..ab95c3e
--- /dev/null
+++ b/tests/tests2/57_btype_excess-2.c
@@ -0,0 +1 @@
+char int i;
diff --git a/tests/tests2/57_btype_excess-2.expect b/tests/tests2/57_btype_excess-2.expect
new file mode 100644
index 0000000..c12ef81
--- /dev/null
+++ b/tests/tests2/57_btype_excess-2.expect
@@ -0,0 +1 @@
+57_btype_excess-2.c:1: error: too many basic types
diff --git a/tests/tests2/58_function_redefinition.c b/tests/tests2/58_function_redefinition.c
new file mode 100644
index 0000000..33f16ee
--- /dev/null
+++ b/tests/tests2/58_function_redefinition.c
@@ -0,0 +1,9 @@
+int f(void)
+{
+ return 0;
+}
+
+int f(void)
+{
+ return 1;
+}
diff --git a/tests/tests2/58_function_redefinition.expect b/tests/tests2/58_function_redefinition.expect
new file mode 100644
index 0000000..a95a3f0
--- /dev/null
+++ b/tests/tests2/58_function_redefinition.expect
@@ -0,0 +1 @@
+58_function_redefinition.c:7: error: redefinition of 'f'
diff --git a/tests/tests2/59_function_array.c b/tests/tests2/59_function_array.c
new file mode 100644
index 0000000..9fcc12d
--- /dev/null
+++ b/tests/tests2/59_function_array.c
@@ -0,0 +1 @@
+int (*fct)[42](int x);
diff --git a/tests/tests2/59_function_array.expect b/tests/tests2/59_function_array.expect
new file mode 100644
index 0000000..bf62c6e
--- /dev/null
+++ b/tests/tests2/59_function_array.expect
@@ -0,0 +1 @@
+59_function_array.c:1: error: declaration of an array of functions
diff --git a/tests/tests2/60_enum_redefinition.c b/tests/tests2/60_enum_redefinition.c
new file mode 100644
index 0000000..2601560
--- /dev/null
+++ b/tests/tests2/60_enum_redefinition.c
@@ -0,0 +1,4 @@
+enum color {RED, GREEN, BLUE};
+enum color {R, G, B};
+
+enum color c;
diff --git a/tests/tests2/60_enum_redefinition.expect b/tests/tests2/60_enum_redefinition.expect
new file mode 100644
index 0000000..5cb41bc
--- /dev/null
+++ b/tests/tests2/60_enum_redefinition.expect
@@ -0,0 +1 @@
+60_enum_redefinition.c:2: error: struct/union/enum already defined
diff --git a/tests/tests2/61_undefined_enum.c b/tests/tests2/61_undefined_enum.c
new file mode 100644
index 0000000..bc7c6ea
--- /dev/null
+++ b/tests/tests2/61_undefined_enum.c
@@ -0,0 +1 @@
+enum rgb c = 42;
diff --git a/tests/tests2/61_undefined_enum.expect b/tests/tests2/61_undefined_enum.expect
new file mode 100644
index 0000000..7ccdeca
--- /dev/null
+++ b/tests/tests2/61_undefined_enum.expect
@@ -0,0 +1 @@
+61_undefined_enum.c:1: error: unknown struct/union/enum
diff --git a/tests/tests2/62_enumerator_redefinition.c b/tests/tests2/62_enumerator_redefinition.c
new file mode 100644
index 0000000..3da85ae
--- /dev/null
+++ b/tests/tests2/62_enumerator_redefinition.c
@@ -0,0 +1,4 @@
+enum color {RED, GREEN, BLUE};
+enum rgb {RED, G, B};
+
+enum color c = RED;
diff --git a/tests/tests2/62_enumerator_redefinition.expect b/tests/tests2/62_enumerator_redefinition.expect
new file mode 100644
index 0000000..3d0e879
--- /dev/null
+++ b/tests/tests2/62_enumerator_redefinition.expect
@@ -0,0 +1 @@
+62_enumerator_redefinition.c:2: error: redefinition of enumerator 'RED'
diff --git a/tests/tests2/63_local_enumerator_redefinition.c b/tests/tests2/63_local_enumerator_redefinition.c
new file mode 100644
index 0000000..dd4d8e0
--- /dev/null
+++ b/tests/tests2/63_local_enumerator_redefinition.c
@@ -0,0 +1,14 @@
+enum {
+ FOO,
+ BAR
+};
+
+int main(void)
+{
+ enum {
+ FOO = 2,
+ BAR
+ };
+
+ return BAR - FOO;
+}
diff --git a/tests/tests2/63_local_enumerator_redefinition.expect b/tests/tests2/63_local_enumerator_redefinition.expect
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/tests2/63_local_enumerator_redefinition.expect
diff --git a/tests/tests2/64_macro_nesting.c b/tests/tests2/64_macro_nesting.c
new file mode 100644
index 0000000..44b582f
--- /dev/null
+++ b/tests/tests2/64_macro_nesting.c
@@ -0,0 +1,10 @@
+#define CAT2(a,b) a##b
+#define CAT(a,b) CAT2(a,b)
+#define AB(x) CAT(x,y)
+
+int main(void)
+{
+ int xy = 42;
+ printf("%d\n", CAT(A,B)(x));
+ return 0;
+}
diff --git a/tests/tests2/64_macro_nesting.expect b/tests/tests2/64_macro_nesting.expect
new file mode 100644
index 0000000..d81cc07
--- /dev/null
+++ b/tests/tests2/64_macro_nesting.expect
@@ -0,0 +1 @@
+42
diff --git a/tests/tests2/65_macro_concat_start.c b/tests/tests2/65_macro_concat_start.c
new file mode 100644
index 0000000..d63d67a
--- /dev/null
+++ b/tests/tests2/65_macro_concat_start.c
@@ -0,0 +1,2 @@
+#define paste(A,B) ##A B
+paste(x,y)
diff --git a/tests/tests2/65_macro_concat_start.expect b/tests/tests2/65_macro_concat_start.expect
new file mode 100644
index 0000000..88ed6c5
--- /dev/null
+++ b/tests/tests2/65_macro_concat_start.expect
@@ -0,0 +1 @@
+65_macro_concat_start.c:1: error: '##' invalid at start of macro
diff --git a/tests/tests2/66_macro_concat_end.c b/tests/tests2/66_macro_concat_end.c
new file mode 100644
index 0000000..55dcaef
--- /dev/null
+++ b/tests/tests2/66_macro_concat_end.c
@@ -0,0 +1,2 @@
+#define paste(A,B) A B##
+paste(x,y)
diff --git a/tests/tests2/66_macro_concat_end.expect b/tests/tests2/66_macro_concat_end.expect
new file mode 100644
index 0000000..224e5c9
--- /dev/null
+++ b/tests/tests2/66_macro_concat_end.expect
@@ -0,0 +1 @@
+66_macro_concat_end.c:2: error: '##' invalid at end of macro
diff --git a/tests/tests2/67_macro_concat.c b/tests/tests2/67_macro_concat.c
new file mode 100644
index 0000000..c580d3a
--- /dev/null
+++ b/tests/tests2/67_macro_concat.c
@@ -0,0 +1,14 @@
+#include <stdio.h>
+
+#define P(A,B) A ## B ; bob
+#define Q(A,B) A ## B+
+
+int main(void)
+{
+ int bob, jim = 21;
+ bob = P(jim,) *= 2;
+ printf("jim: %d, bob: %d\n", jim, bob);
+ jim = 60 Q(+,)3;
+ printf("jim: %d\n", jim);
+ return 0;
+}
diff --git a/tests/tests2/67_macro_concat.expect b/tests/tests2/67_macro_concat.expect
new file mode 100644
index 0000000..8386c2d
--- /dev/null
+++ b/tests/tests2/67_macro_concat.expect
@@ -0,0 +1,2 @@
+jim: 21, bob: 42
+jim: 63
diff --git a/tests/tests2/Makefile b/tests/tests2/Makefile
index 369ed47..c47fe0a 100644
--- a/tests/tests2/Makefile
+++ b/tests/tests2/Makefile
@@ -1,10 +1,10 @@
TOP = ../..
include $(TOP)/Makefile
-VPATH = $(top_srcdir)/tests/tests2
-TCCFLAGS = -B$(TOP) -I$(top_srcdir)/include
ifdef CONFIG_WIN32
TCCFLAGS = -B$(top_srcdir)/win32 -I$(top_srcdir)/include -L$(TOP)
+else
+ TCCFLAGS = -B$(TOP) -I$(top_srcdir)/include -lm
endif
ifeq ($(TARGETOS),Darwin)
@@ -46,9 +46,11 @@ TESTS = \
27_sizeof.test \
28_strings.test \
29_array_address.test \
+ 30_hanoi.test \
31_args.test \
32_led.test \
33_ternary_op.test \
+ 34_array_assignment.test \
35_sizeof.test \
36_array_initialisers.test \
37_sprintf.test \
@@ -60,6 +62,7 @@ TESTS = \
43_void_param.test \
44_scoped_declarations.test \
45_empty_for.test \
+ 46_grep.test \
47_switch_return.test \
48_nested_break.test \
49_bracket_evaluation.test \
@@ -67,35 +70,48 @@ TESTS = \
51_static.test \
52_unnamed_enum.test \
54_goto.test \
- 55_lshift_type.test
+ 55_lshift_type.test \
+ 56_btype_excess-1.test \
+ 57_btype_excess-2.test \
+ 58_function_redefinition.test \
+ 59_function_array.test \
+ 60_enum_redefinition.test \
+ 61_undefined_enum.test \
+ 62_enumerator_redefinition.test \
+ 63_local_enumerator_redefinition.test \
+ 64_macro_nesting.test \
+ 65_macro_concat_start.test \
+ 66_macro_concat_end.test \
+ 67_macro_concat.test
-# 30_hanoi.test -- seg fault in the code, gcc as well
# 34_array_assignment.test -- array assignment is not in C standard
-# 46_grep.test -- does not compile even with gcc
+
+SKIP = 34_array_assignment.test
# some tests do not pass on all platforms, remove them for now
ifeq ($(TARGETOS),Darwin)
- TESTS := $(filter-out 40_stdio.test,$(TESTS))
+ SKIP += 40_stdio.test
endif
ifdef CONFIG_WIN32
- TESTS := $(filter-out 24_math_library.test 28_strings.test,$(TESTS))
+ SKIP += 24_math_library.test # don't have round()
+ SKIP += 28_strings.test # don't have r/index() / strings.h
endif
+# Some tests might need arguments
+ARGS =
+31_args.test : ARGS = arg1 arg2 arg3 arg4 arg5
+46_grep.test : ARGS = '[^* ]*[:a:d: ]+\:\*-/: $$' 46_grep.c
+
+all test: $(filter-out $(SKIP),$(TESTS))
+
%.test: %.c %.expect
@echo Test: $*...
- @if [ "x`echo $* | grep args`" != "x" ]; \
- then $(TCC) $< -norunsrc -run $(notdir $<) - arg1 arg2 arg3 arg4 >$*.output; \
- else $(TCC) -run $< >$*.output; \
- fi
- @if diff -bu $(<:.c=.expect) $*.output ; \
- then rm -f $*.output; \
- else exit 1; \
- fi
-all test: $(TESTS)
+ @$(TCC) -run $< $(ARGS) >$*.output 2>&1 || true
+ @diff -bu $*.expect $*.output && rm -f $*.output
-clean:
- rm -vf fred.txt *.output
+ @($(TCC) $< -o $*.exe && ./$*.exe $(ARGS)) >$*.output2 2>&1 || true
+ @diff -bu $*.expect $*.output2 && rm -f $*.output2 $*.exe
-Makefile: $(top_srcdir)/tests/tests2/Makefile
- cp $< $@
+clean:
+ rm -vf fred.txt *.output* *.exe