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