summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/dtypes.c102
-rw-r--r--test/titerate.c4
2 files changed, 104 insertions, 2 deletions
diff --git a/test/dtypes.c b/test/dtypes.c
index 285a174..035e755 100644
--- a/test/dtypes.c
+++ b/test/dtypes.c
@@ -751,7 +751,105 @@ test_compound_4(void)
error:
return 1;
}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_compound_5
+ *
+ * Purpose: Many versions of HDF5 have a bug in the optimized compound
+ * datatype conversion function, H5T_conv_struct_opt(), which
+ * is triggered when the top-level type contains a struct
+ * which must undergo a conversion.
+ *
+ * Return: Success: 0
+ *
+ * Failure: number of errors
+ *
+ * Programmer: Robb Matzke
+ * Thursday, June 17, 1999
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_compound_5(void)
+{
+ typedef struct {
+ char name[16];
+ short tdim;
+ short coll_ids[4];
+ } src_type_t;
+
+ typedef struct {
+ char name[16];
+ short tdim;
+ int coll_ids[4];
+ } dst_type_t;
+
+ hsize_t dims[1] = {4};
+ hid_t src_type, dst_type, short_array, int_array, string;
+ src_type_t src[2] = {{"one", 102, {104, 105, 106, 107}},
+ {"two", 202, {204, 205, 206, 207}}};
+ dst_type_t *dst;
+ void *buf = calloc(2, sizeof(dst_type_t));
+ void *bkg = calloc(2, sizeof(dst_type_t));
+
+#if 1
+ TESTING("optimized struct converter");
+#else
+ /* Turn off optimized compound conversion function to work around
+ * the problem. */
+ TESTING("optimized struct converter bug workaround");
+ H5Tunregister(H5T_PERS_DONTCARE, "struct(opt)", -1, -1, NULL);
+#endif
+
+ /* Build datatypes */
+ short_array = H5Tcreate(H5T_COMPOUND, 4*sizeof(short));
+ H5Tinsert_array(short_array, "_", 0, 1, dims, NULL, H5T_NATIVE_SHORT);
+
+ int_array = H5Tcreate(H5T_COMPOUND, 4*sizeof(int));
+ H5Tinsert_array(int_array, "_", 0, 1, dims, NULL, H5T_NATIVE_INT);
+
+ string = H5Tcopy(H5T_C_S1);
+ H5Tset_size(string, 16);
+
+ src_type = H5Tcreate(H5T_COMPOUND, sizeof(src_type_t));
+ H5Tinsert(src_type, "name", HOFFSET(src_type_t, name), string );
+ H5Tinsert(src_type, "tdim", HOFFSET(src_type_t, tdim), H5T_NATIVE_SHORT);
+ H5Tinsert(src_type, "coll_ids", HOFFSET(src_type_t, coll_ids), short_array );
+
+ dst_type = H5Tcreate(H5T_COMPOUND, sizeof(dst_type_t));
+ H5Tinsert(dst_type, "name", HOFFSET(dst_type_t, name), string );
+ H5Tinsert(dst_type, "tdim", HOFFSET(dst_type_t, tdim), H5T_NATIVE_SHORT);
+ H5Tinsert(dst_type, "coll_ids", HOFFSET(dst_type_t, coll_ids), int_array );
+
+ /* Convert data */
+ memcpy(buf, src, sizeof(src));
+ H5Tconvert(src_type, dst_type, 2, buf, bkg, H5P_DEFAULT);
+ dst = (dst_type_t*)buf;
+
+ /* Cleanup */
+ H5Tclose(src_type);
+ H5Tclose(dst_type);
+ H5Tclose(string);
+ H5Tclose(short_array);
+ H5Tclose(int_array);
+
+ /* Check results */
+ if (memcmp(src[1].name, dst[1].name, sizeof(src[1].name)) ||
+ src[1].tdim!=dst[1].tdim ||
+ src[1].coll_ids[0]!=dst[1].coll_ids[0] ||
+ src[1].coll_ids[1]!=dst[1].coll_ids[1] ||
+ src[1].coll_ids[2]!=dst[1].coll_ids[2] ||
+ src[1].coll_ids[3]!=dst[1].coll_ids[3]) {
+ FAILED();
+ return 1;
+ }
+ PASSED();
+ return 0;
+}
/*-------------------------------------------------------------------------
@@ -1589,7 +1687,8 @@ test_conv_bitfield(void)
*/
static herr_t
convert_opaque(hid_t UNUSED st, hid_t UNUSED dt, H5T_cdata_t *cdata,
- size_t UNUSED nelmts, size_t UNUSED stride, void UNUSED *_buf,
+ size_t UNUSED nelmts, size_t UNUSED buf_stride,
+ size_t UNUSED bkg_stride, void UNUSED *_buf,
void UNUSED *bkg, hid_t UNUSED dset_xfer_plid)
{
if (H5T_CONV_CONV==cdata->command) num_opaque_conversions_g++;
@@ -3570,6 +3669,7 @@ main(void)
nerrors += test_compound_2();
nerrors += test_compound_3();
nerrors += test_compound_4();
+ nerrors += test_compound_5();
nerrors += test_conv_int ();
nerrors += test_conv_enum_1();
nerrors += test_conv_bitfield();
diff --git a/test/titerate.c b/test/titerate.c
index 751f090..5e56001 100644
--- a/test/titerate.c
+++ b/test/titerate.c
@@ -425,7 +425,7 @@ static void test_iter_group_large(void)
hsize_t dims[] = {SPACE1_DIM1};
herr_t ret; /* Generic return value */
char gname[20]; /* Temporary group name */
- iter_info names[NGROUPS+2]={0}; /* Names of objects in the root group */
+ iter_info names[NGROUPS+2]; /* Names of objects in the root group */
iter_info *curr_name; /* Pointer to the current name in the root group */
int i;
@@ -436,6 +436,8 @@ static void test_iter_group_large(void)
float c;
} s1_t;
+ memset(names, 0, sizeof names);
+
/* Output message about test being performed */
MESSAGE(5, ("Testing Large Group Iteration Functionality\n"));