aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/pr93524.c
blob: 24e5e094631f97fa75feeaddec60258719029b99 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Test the fix for PR93524, in which CFI_allocate was computing
   sm incorrectly for dimensions > 2.  */

#include <stdlib.h>  // For size_t
#include "../../../libgfortran/ISO_Fortran_binding.h"

void my_fortran_sub_1 (CFI_cdesc_t *dv); 
void my_fortran_sub_2 (CFI_cdesc_t *dv); 

int main ()
{
  CFI_CDESC_T (3) a;
  CFI_cdesc_t *dv = (CFI_cdesc_t *) &a;
  // dv, base_addr, attribute,            type, elem_len, rank, extents
  CFI_establish (dv, NULL, CFI_attribute_allocatable, CFI_type_float, 0, 3, NULL); 

  if (dv->base_addr != NULL)
    return 1;  // shall not be allocated

  CFI_index_t lower_bounds[] = {-10, 0, 3}; 
  CFI_index_t upper_bounds[] = {10, 5, 10}; 
  size_t elem_len = 0;  // only needed for strings
  if (CFI_SUCCESS != CFI_allocate (dv, lower_bounds, upper_bounds, elem_len))
    return 2;

  if (!CFI_is_contiguous (dv))
    return 2;  // allocatables shall be contiguous,unless a strided section is used

  my_fortran_sub_1 (dv);
  my_fortran_sub_2 (dv);
  CFI_deallocate (dv);
  return 0;
}