(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
c-interop/
section-errors-c.c
       1  #include <stdlib.h>
       2  #include <stdint.h>
       3  #include <stdio.h>
       4  #include <string.h>
       5  
       6  #include <ISO_Fortran_binding.h>
       7  #include "dump-descriptors.h"
       8  
       9  /* For simplicity, point descriptors at a static buffer.  */
      10  #define BUFSIZE 256
      11  static char *buf[BUFSIZE] __attribute__ ((aligned (8)));
      12  static CFI_index_t extents[] = {10};
      13  
      14  /* External entry point.  The arguments are descriptors for input arrays;
      15     we'll construct new descriptors for the outputs of CFI_section.  */
      16  extern void ctest (void);
      17  
      18  void
      19  ctest (void)
      20  {
      21    int bad = 0;
      22    int status;
      23    CFI_CDESC_T(1) sdesc;
      24    CFI_cdesc_t *source = (CFI_cdesc_t *) &sdesc;
      25    CFI_CDESC_T(3) rdesc;
      26    CFI_cdesc_t *result = (CFI_cdesc_t *) &rdesc;
      27    CFI_index_t lb = 2;
      28    CFI_index_t ub = 8;
      29    CFI_index_t step = 2;
      30    CFI_index_t zstep = 0;
      31  
      32    /* Use a 1-d integer source array for the first few tests.  */
      33    check_CFI_status ("CFI_establish",
      34  		    CFI_establish (source, (void *)buf, CFI_attribute_other,
      35  				   CFI_type_int, 0, 1, extents));
      36  
      37    /* result shall be the address of a C descriptor with rank equal
      38       to the rank of source minus the number of zero strides.  */
      39    check_CFI_status ("CFI_establish", 
      40  		    CFI_establish (result, NULL, CFI_attribute_pointer,
      41  				   CFI_type_int, 0, 0, NULL));
      42    status = CFI_section (result, source, &lb, &ub, &step);
      43    if (status == CFI_SUCCESS)
      44      {
      45        fprintf (stderr,
      46  	       "no error for rank mismatch (too small)\n");
      47        bad ++;
      48      }
      49  
      50    check_CFI_status ("CFI_establish", 
      51  		    CFI_establish (result, NULL, CFI_attribute_pointer,
      52  				   CFI_type_int, 0, 1, NULL));
      53    status = CFI_section (result, source, &lb, &lb, &zstep);
      54    if (status == CFI_SUCCESS)
      55      {
      56        fprintf (stderr,
      57  	       "no error for rank mismatch (zero stride)\n");
      58        bad ++;
      59      }
      60  
      61    check_CFI_status ("CFI_establish", 
      62  		    CFI_establish (result, NULL, CFI_attribute_pointer,
      63  				   CFI_type_int, 0, 3, NULL));
      64    status = CFI_section (result, source, &lb, &ub, &step);
      65    if (status == CFI_SUCCESS)
      66      {
      67        fprintf (stderr,
      68  	       "no error for rank mismatch (too large)\n");
      69        bad ++;
      70      }
      71  
      72    /* The attribute member [of result] shall have the value
      73       CFI_attribute_other or CFI_attribute_pointer.  */
      74    check_CFI_status ("CFI_establish", 
      75  		    CFI_establish (result, NULL, CFI_attribute_allocatable,
      76  				   CFI_type_int, 0, 1, NULL));
      77    status = CFI_section (result, source, &lb, &ub, &step);
      78    if (status == CFI_SUCCESS)
      79      {
      80        fprintf (stderr,
      81  	       "no error for CFI_attribute_allocatable result\n");
      82        bad ++;
      83      }
      84  
      85    /* source shall be the address of a C descriptor that describes a
      86       nonallocatable nonpointer array, an allocated allocatable array,
      87       or an associated array pointer.  */
      88    check_CFI_status ("CFI_establish",
      89  		    CFI_establish (source, NULL, CFI_attribute_allocatable,
      90  				   CFI_type_int, 0, 1, NULL));
      91    check_CFI_status ("CFI_establish", 
      92  		    CFI_establish (result, NULL, CFI_attribute_pointer,
      93  				   CFI_type_int, 0, 1, NULL));
      94    status = CFI_section (result, source, &lb, &ub, &step);
      95    if (status == CFI_SUCCESS)
      96      {
      97        fprintf (stderr,
      98  	       "no error for unallocated allocatable source array\n");
      99        bad ++;
     100      }
     101  
     102    check_CFI_status ("CFI_establish",
     103  		    CFI_establish (source, NULL, CFI_attribute_pointer,
     104  				   CFI_type_int, 0, 1, NULL));
     105    check_CFI_status ("CFI_establish", 
     106  		    CFI_establish (result, NULL, CFI_attribute_pointer,
     107  				   CFI_type_int, 0, 1, NULL));
     108    status = CFI_section (result, source, &lb, &ub, &step);
     109    if (status == CFI_SUCCESS)
     110      {
     111        fprintf (stderr,
     112  	       "no error for unassociated pointer source array\n");
     113        bad ++;
     114      }
     115  
     116    /* The corresponding values of the elem_len and type members shall
     117       be the same in the C descriptors with the addresses source
     118       and result.  */
     119    check_CFI_status ("CFI_establish",
     120  		    CFI_establish (source, (void *)buf, CFI_attribute_other,
     121  				   CFI_type_struct,
     122  				   sizeof(int), 1, extents));
     123    check_CFI_status ("CFI_establish", 
     124  		    CFI_establish (result, NULL, CFI_attribute_pointer,
     125  				   CFI_type_struct,
     126  				   2*sizeof (int), 1, NULL));
     127    status = CFI_section (result, source, &lb, &ub, &step);
     128    if (status == CFI_SUCCESS)
     129      {
     130        fprintf (stderr,
     131  	       "no error for elem_len mismatch\n");
     132        bad ++;
     133      }
     134  
     135    check_CFI_status ("CFI_establish", 
     136  		    CFI_establish (result, NULL, CFI_attribute_pointer,
     137  				   CFI_type_int, 0, 1, NULL));
     138    status = CFI_section (result, source, &lb, &ub, &step);
     139    if (status == CFI_SUCCESS)
     140      {
     141        fprintf (stderr,
     142  	       "no error for type mismatch\n");
     143        bad ++;
     144      }
     145  
     146    if (bad)
     147      abort ();
     148  }
     149