(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
bind-c-contiguous-3.c
       1  #include <ISO_Fortran_binding.h>
       2  
       3  intptr_t assumed_rank_alloc_f (CFI_cdesc_t *);
       4  intptr_t assumed_rank_pointer_f (CFI_cdesc_t *);
       5  intptr_t assumed_rank_f (CFI_cdesc_t *);
       6  intptr_t assumed_rank_cont_f (CFI_cdesc_t *);
       7  intptr_t assumed_shape_f (CFI_cdesc_t *);
       8  intptr_t assumed_shape_cont_f (CFI_cdesc_t *);
       9  intptr_t deferred_shape_alloc_f (CFI_cdesc_t *);
      10  intptr_t deferred_shape_pointer_f (CFI_cdesc_t *);
      11  
      12  
      13  static void
      14  basic_check(CFI_cdesc_t *x)
      15  {
      16    if (!x->base_addr)
      17      __builtin_abort ();
      18    if (x->elem_len != sizeof(int32_t))
      19      __builtin_abort ();
      20    if (x->version != CFI_VERSION)
      21      __builtin_abort ();
      22    if (x->rank != 4)
      23      __builtin_abort ();
      24    if (x->type != CFI_type_int32_t)
      25      __builtin_abort ();
      26    if (x->attribute == CFI_attribute_other)
      27      {
      28        if (x->dim[0].lower_bound != 0)
      29  	__builtin_abort ();
      30        if (x->dim[1].lower_bound != 0)
      31  	__builtin_abort ();
      32        if (x->dim[2].lower_bound != 0)
      33  	__builtin_abort ();
      34        if (x->dim[3].lower_bound != 0)
      35  	__builtin_abort ();
      36      }
      37  }
      38  
      39  intptr_t
      40  assumed_rank_alloc_c (CFI_cdesc_t *x)
      41  {
      42    basic_check (x);
      43    if (!CFI_is_contiguous (x))
      44      __builtin_abort ();
      45    if (x->attribute != CFI_attribute_allocatable)
      46      __builtin_abort ();
      47    intptr_t addr = (intptr_t) x->base_addr;
      48    intptr_t addr2 = assumed_rank_alloc_f (x);
      49    if (addr != addr2 || addr != (intptr_t) x->base_addr)
      50      __builtin_abort ();
      51    return addr;
      52  }
      53  
      54  intptr_t
      55  assumed_rank_pointer_c (CFI_cdesc_t *x)
      56  {
      57    basic_check (x);
      58    if (x->attribute != CFI_attribute_pointer)
      59      __builtin_abort ();
      60    intptr_t addr = (intptr_t) x->base_addr;
      61    intptr_t addr2 = assumed_rank_pointer_f (x);
      62    if (addr != addr2 || addr != (intptr_t) x->base_addr)
      63      __builtin_abort ();
      64    return addr;
      65  }
      66  
      67  
      68  intptr_t
      69  assumed_rank_c (CFI_cdesc_t *x)
      70  {
      71    basic_check (x);
      72    if (x->attribute != CFI_attribute_other)
      73      __builtin_abort ();
      74    intptr_t addr = (intptr_t) x->base_addr;
      75    intptr_t addr2 = assumed_rank_f (x);
      76    if (addr != addr2 || addr != (intptr_t) x->base_addr)
      77      __builtin_abort ();
      78    return addr;
      79  }
      80  
      81  intptr_t
      82  assumed_rank_cont_c (CFI_cdesc_t *x)
      83  {
      84    basic_check (x);
      85    if (!CFI_is_contiguous (x))
      86      __builtin_abort ();
      87    if (x->attribute != CFI_attribute_other)
      88      __builtin_abort ();
      89    intptr_t addr = (intptr_t) x->base_addr;
      90    intptr_t addr2 = assumed_rank_cont_f (x);
      91    if (addr != addr2 || addr != (intptr_t) x->base_addr)
      92      __builtin_abort ();
      93    return addr;
      94  }
      95  
      96  intptr_t
      97  assumed_shape_c (CFI_cdesc_t *x, int num)
      98  {
      99    basic_check (x);
     100    if (x->attribute != CFI_attribute_other)
     101      __builtin_abort ();
     102    intptr_t addr = (intptr_t) x->base_addr;
     103    intptr_t addr2;
     104    if (num == 1 || num == 2 || num == 3)
     105      {
     106        if (!CFI_is_contiguous (x))
     107  	__builtin_abort ();
     108      }
     109    else
     110      {
     111        if (CFI_is_contiguous (x))
     112  	__builtin_abort ();
     113      }
     114  
     115    if (num == 1 || num == 4)
     116      addr2 = assumed_shape_f (x);
     117    else if (num == 2 || num == 5)
     118      addr2 = assumed_shape_cont_f (x);
     119    else if (num == 3 || num == 6)
     120      addr2 = assumed_rank_cont_f (x);
     121    else
     122      __builtin_abort ();
     123  
     124    if (num == 1 || num == 2 || num == 3)
     125      {
     126        if (addr != addr2)
     127  	__builtin_abort ();
     128      }
     129    else
     130      {
     131        if (CFI_is_contiguous (x))
     132  	__builtin_abort ();
     133      }
     134    if (addr != (intptr_t) x->base_addr)
     135      __builtin_abort ();
     136    return addr2;
     137  }
     138  
     139  intptr_t
     140  assumed_shape_cont_c (CFI_cdesc_t *x)
     141  {
     142    basic_check (x);
     143    if (!CFI_is_contiguous (x))
     144      __builtin_abort ();
     145    if (x->attribute != CFI_attribute_other)
     146      __builtin_abort ();
     147    intptr_t addr = (intptr_t) x->base_addr;
     148    intptr_t addr2 = assumed_shape_cont_f (x);
     149    if (addr != addr2 || addr != (intptr_t) x->base_addr)
     150      __builtin_abort ();
     151    return addr;
     152  }
     153  
     154  intptr_t
     155  deferred_shape_alloc_c (CFI_cdesc_t *x)
     156  {
     157    basic_check (x);
     158    if (!CFI_is_contiguous (x))
     159      __builtin_abort ();
     160    if (x->attribute != CFI_attribute_allocatable)
     161      __builtin_abort ();
     162    intptr_t addr = (intptr_t) x->base_addr;
     163    intptr_t addr2 = deferred_shape_alloc_f (x);
     164    if (addr != addr2 || addr != (intptr_t) x->base_addr)
     165      __builtin_abort ();
     166    return addr;
     167  }
     168  
     169  intptr_t
     170  deferred_shape_pointer_c (CFI_cdesc_t *x)
     171  {
     172    basic_check (x);
     173    if (x->attribute != CFI_attribute_pointer)
     174      __builtin_abort ();
     175    intptr_t addr = (intptr_t) x->base_addr;
     176    intptr_t addr2 = deferred_shape_pointer_f (x);
     177    if (addr != addr2 || addr != (intptr_t) x->base_addr)
     178      __builtin_abort ();
     179    return addr;
     180  }