@@ -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