test-array.c revision 4f3374cf603147d6e3d60c9dd6e1cfe1c1926c1a
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2007-2014 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "test-lib.h"
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen#include "array.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include <stdlib.h> /* rand() */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainenstruct foo {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int a, b, c;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
6fe91298731abf0b70dfd796ecc30d3be81fa5d1Timo Sirainenstatic void test_array_foreach(void)
5fb3bff645380804c9db2510940c41db6b8fdb01Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY(struct foo) foos;
f6f021c133f680cf3d559187524fd9abcbaae9b9Timo Sirainen const struct foo *foo;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct foo nfoo;
73a552a9ed06cd6017ad4ee4b252a8b38c8ac42dTimo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
73a552a9ed06cd6017ad4ee4b252a8b38c8ac42dTimo Sirainen test_begin("array foreach");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen t_array_init(&foos, 32);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < 10; i++) {
7ccdf78cd45aea9d14e048a5b9f077515c71978fTimo Sirainen nfoo.a = nfoo.b = nfoo.c = i;
7ccdf78cd45aea9d14e048a5b9f077515c71978fTimo Sirainen array_append(&foos, &nfoo, 1);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen }
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen array_foreach(&foos, foo) {
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen i = array_foreach_idx(&foos, foo);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert(foo->a == i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert(foo->b == i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert(foo->c == i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen }
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_end();
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen}
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic void test_array_reverse(void)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen{
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen ARRAY(int) intarr;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen int input[] = { -1234567890, -272585721, 272485922, 824725652 };
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen const int *output;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen unsigned int i, j;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_begin("array reverse");
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen t_array_init(&intarr, 5);
6fe91298731abf0b70dfd796ecc30d3be81fa5d1Timo Sirainen for (i = 0; i <= N_ELEMENTS(input); i++) {
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen array_clear(&intarr);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen array_append(&intarr, input, i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen array_reverse(&intarr);
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
6fe91298731abf0b70dfd796ecc30d3be81fa5d1Timo Sirainen output = i == 0 ? NULL : array_idx(&intarr, 0);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen for (j = 0; j < i; j++)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert(input[i-j-1] == output[j]);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen }
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_end();
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen}
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_ushort(const unsigned short *c1, const unsigned short *c2)
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen{
00efa7d99981e18e286c02b18c1163dde18ee521Timo Sirainen return *c1 > *c2 ? 1
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen : *c1 < *c2 ? -1
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen : 0;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen}
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_ushort_fuzz(const unsigned short *c1, const unsigned short *c2, const int *pfuzz)
641f0c0900ee6e7cf9667f4b40ed95cec7d0cdcaTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int d = (int)*c1 - (int)*c2;
6013fbad6638795a00e6c2a2dd2cdbee19612494Timo Sirainen if (d <= *pfuzz && -d <= *pfuzz)
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen return 0;
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen return d;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic void test_array_cmp(void)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen{
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen static const unsigned short deltas[] = {
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen -32768, -16384, -512, -256, -128, -64, -2, -1,
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen 0, 1, 2, 64, 128, 256, 512, 16384, 32768
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen };
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen#define NELEMS 5u
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen ARRAY(unsigned short) arr1, arr2;
641f0c0900ee6e7cf9667f4b40ed95cec7d0cdcaTimo Sirainen unsigned short elems[NELEMS+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen int fuzz;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen test_begin("array compare (ushort)");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen t_array_init(&arr1, NELEMS);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen t_array_init(&arr2, NELEMS);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen for (i = 0; i < NELEMS; i++) {
d22301419109ed4a38351715e6760011421dadecTimo Sirainen elems[i] = rand();
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen array_append(&arr2, &elems[i], 1);
2f2823ad8928654ed405467c6c1f4fd4c6f5cf7cTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen array_append(&arr1, elems, NELEMS);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 1);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 1);
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen fuzz = 0;
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen for (i = 0; i < 256; i++) {
42eaa08044fbb134cdc7b342355d8f6772f647fbTimo Sirainen unsigned int j = rand() % NELEMS;
7fc0f80480063a9d4cb9e8c07b50db2a5627799eTimo Sirainen unsigned short tmp = *array_idx(&arr2, j);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen unsigned short repl = tmp + deltas[rand() % N_ELEMENTS(deltas)];
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen array_idx_set(&arr2, j, &repl);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_cmp(&arr1, &arr2) == (tmp == repl), i);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_ushort) == (tmp == repl), i);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen fuzz = (int)tmp - (int)repl;
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen if (fuzz < 0)
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen fuzz = -fuzz;
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1, i);
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainen if (fuzz > 0) {
59151b71059df1190acd75d8717ed04a7920c862Timo Sirainen fuzz--;
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 0, i);
00efa7d99981e18e286c02b18c1163dde18ee521Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen array_idx_set(&arr2, j, &tmp);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert_idx(array_cmp(&arr1, &arr2) == TRUE, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 1, i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen fuzz = 0;
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 1, i);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen }
7ccdf78cd45aea9d14e048a5b9f077515c71978fTimo Sirainen elems[NELEMS] = 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen array_append(&arr2, &elems[NELEMS], 1);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 0);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_ushort) == 0);
f7ad1162969feff6b08f0e640a928db1783daae9Timo Sirainen test_assert_idx(array_equal_fn_ctx(&arr1, &arr2, test_compare_ushort_fuzz, &fuzz) == 0, i);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen test_end();
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen}
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainenstatic int test_compare_string(const char *const *c1, const char *const *c2)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return strcmp(*c1, *c2);
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen}
825f6569a5276488133796c2f529c65128a09ba0Timo Sirainenstatic void test_array_cmp_str(void)
785d9cca224d33ca3938e9166784f6483e8a27d7Timo Sirainen{
039e42997fe5e0d1c5ad9306dc0ae69bf0e1ca10Timo Sirainen#define NELEMS 5u
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ARRAY(const char *) arr1, arr2;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *elemstrs[NELEMS+1];
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen unsigned int i;
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen test_begin("array compare (char*)");
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen t_array_init(&arr1, NELEMS);
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen t_array_init(&arr2, NELEMS);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen for (i = 0; i < NELEMS; i++) {
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen elemstrs[i] = t_strdup_printf("%x", rand()); /* never 0-length */
e156adefc1260d31a145df2f5e9b3c82050d4163Timo Sirainen array_append(&arr2, &elemstrs[i], 1);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen }
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen array_append(&arr1, elemstrs, NELEMS);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 1); /* pointers shared, so identical */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_equal_fn(&arr1, &arr2, test_compare_string) == 1); /* therefore value same */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen for (i = 0; i < 2560; i++) {
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen unsigned int j = rand() % NELEMS;
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen const char *ostr = *array_idx(&arr2, j);
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen unsigned int olen = strlen(ostr);
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen unsigned int rc = rand() % (olen + 1);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen char ochar = ostr[rc];
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen char buf[12];
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen const char *bufp = buf;
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen memcpy(buf, ostr, olen+1);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen buf[rc] = rand() % (CHAR_MAX + 1 - CHAR_MIN) + CHAR_MIN;
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen if(rc == olen)
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen buf[rc+1] = '\0';
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen array_idx_set(&arr2, j, &bufp);
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen test_assert(array_cmp(&arr1, &arr2) == 0); /* pointers now differ */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string)
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen == (strcmp(ostr, buf) == 0), i); /* sometimes still the same */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string)
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen == (ochar == buf[rc]), i); /* ditto */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen array_idx_set(&arr2, j, &ostr);
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert(array_cmp(&arr1, &arr2) == 1); /* pointers now same again */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_assert_idx(array_equal_fn(&arr1, &arr2, test_compare_string) == 1, i); /* duh! */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen }
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen /* length differences being detected are tested in other tests */
490f66d6476d51cc02333d6eb398a5cd94b67f48Timo Sirainen test_end();
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen}
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainenvoid test_array(void)
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen{
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen test_array_foreach();
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen test_array_reverse();
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen test_array_cmp();
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen test_array_cmp_str();
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen}
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainenenum fatal_test_state fatal_array(int stage)
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen{
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen double tmpd[2] = { 42., -42. };
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen short tmps[8] = {1,2,3,4,5,6,7,8};
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen static const void *useless_ptr; /* persuade gcc to not optimise the tests */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen switch(stage) {
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen case 0: {
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen ARRAY(double) ad;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen test_begin("fatal_array");
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen t_array_init(&ad, 3);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* allocation big enough, but memory not initialised */
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen useless_ptr = array_idx(&ad, 0);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen return FATAL_TEST_FAILURE;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen } break;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen case 1: {
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen ARRAY(double) ad;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen t_array_init(&ad, 2);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen array_append(&ad, tmpd, 2);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* actual out of range address requested */
0b4e1043e596bfb36d999dacbf1d4d63ee96d75fTimo Sirainen useless_ptr = array_idx(&ad, 2);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen return FATAL_TEST_FAILURE;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen } break;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen case 2: {
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen ARRAY(double) ad;
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen ARRAY(short) as;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen t_array_init(&ad, 2);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen t_array_init(&as, 8);
eddd9bf1a1369aea4a2715f6be1137da6d17d293Timo Sirainen array_append(&as, tmps, 2);
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen array_copy(&ad.arr, 1, &as.arr, 0, 4);
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen return FATAL_TEST_FAILURE;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen } break;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen }
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen test_end();
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen /* Forces the compiler to check the value of useless_ptr, so that it
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen must call array_idx (which is marked as pure, and gcc was desperate
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen to optimise out. Of course, gcc is unaware stage is never -1.*/
6cfb1377b2c034cfc4bd37361cc1520f2d8acd6dTimo Sirainen return (useless_ptr != NULL && stage == -1)
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen ? FATAL_TEST_FAILURE : FATAL_TEST_FINISHED;
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen}
32ee977e189266744ef69ac4e832fd3111d6f949Timo Sirainen