@@ -53,7 +53,7 @@ main(int argc, char* argv[])
5353 int ret = 0 ;
5454 int blen [4 ];
5555 ptrdiff_t disp [4 ];
56- ompi_datatype_t * newType , * types [4 ], * struct_type , * vec_type ;
56+ ompi_datatype_t * newType , * types [4 ], * struct_type , * vec_type , * dup_type ;
5757 ptrdiff_t old_lb , old_extent , old_true_lb , old_true_extent ;
5858 ptrdiff_t lb , extent , true_lb , true_extent ;
5959
@@ -397,6 +397,53 @@ main(int argc, char* argv[])
397397 ret = ompi_datatype_destroy (& unpacked_dt );
398398 if (ret != 0 ) goto cleanup ;
399399
400+ /**
401+ *
402+ * TEST 7
403+ *
404+ */
405+ printf ("---> Basic test with dup'ed MPI_INT\n" );
406+
407+ ret = get_extents (& ompi_mpi_int .dt , & old_lb , & old_extent , & old_true_lb , & old_true_extent );
408+ if (ret != 0 ) goto cleanup ;
409+ ret = ompi_datatype_duplicate (& ompi_mpi_int .dt , & dup_type );
410+ if (ret != 0 ) goto cleanup ;
411+ ompi_datatype_t * type = & ompi_mpi_int .dt ;
412+ ret = ompi_datatype_set_args (dup_type , 0 , NULL , 0 , NULL , 1 , & type , MPI_COMBINER_DUP );
413+ if (ret != 0 ) goto cleanup ;
414+ packed_ddt_len = ompi_datatype_pack_description_length (dup_type );
415+ ptr = payload = malloc (packed_ddt_len );
416+ ret = ompi_datatype_get_pack_description (dup_type , & packed_ddt );
417+ if (ret != 0 ) goto cleanup ;
418+
419+ memcpy (payload , packed_ddt , packed_ddt_len );
420+ unpacked_dt = ompi_datatype_create_from_packed_description (& payload ,
421+ ompi_proc_local ());
422+ free (ptr );
423+ if (unpacked_dt == NULL ) {
424+ printf ("\tFAILED: could not unpack datatype\n" );
425+ ret = 1 ;
426+ goto cleanup ;
427+ } else {
428+ ret = get_extents (unpacked_dt , & lb , & extent , & true_lb , & true_extent );
429+ if (ret != 0 ) goto cleanup ;
430+
431+ if (old_lb != lb || old_extent != extent ||
432+ old_true_lb != true_lb || old_true_extent != extent ) {
433+ printf ("\tFAILED: datatypes don't match\n" );
434+ ret = 1 ;
435+ goto cleanup ;
436+ }
437+ printf ("\tPASSED\n" );
438+ }
439+ if (unpacked_dt == & ompi_mpi_int32_t .dt ) {
440+ printf ("\tPASSED\n" );
441+ } else {
442+ printf ("\tFAILED: datatypes don't match\n" );
443+ ret = 1 ;
444+ goto cleanup ;
445+ }
446+ ompi_datatype_destroy (& dup_type );
400447
401448 cleanup :
402449 ompi_datatype_finalize ();
0 commit comments