Viewing file: section-errors-c.c (4.51 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#include <stdlib.h> #include <stdint.h> #include <stdio.h> #include <string.h>
#include <ISO_Fortran_binding.h> #include "dump-descriptors.h"
/* For simplicity, point descriptors at a static buffer. */ #define BUFSIZE 256 static char *buf[BUFSIZE] __attribute__ ((aligned (8))); static CFI_index_t extents[] = {10};
/* External entry point. The arguments are descriptors for input arrays; we'll construct new descriptors for the outputs of CFI_section. */ extern void ctest (void);
void ctest (void) { int bad = 0; int status; CFI_CDESC_T(1) sdesc; CFI_cdesc_t *source = (CFI_cdesc_t *) &sdesc; CFI_CDESC_T(3) rdesc; CFI_cdesc_t *result = (CFI_cdesc_t *) &rdesc; CFI_index_t lb = 2; CFI_index_t ub = 8; CFI_index_t step = 2; CFI_index_t zstep = 0;
/* Use a 1-d integer source array for the first few tests. */ check_CFI_status ("CFI_establish", CFI_establish (source, (void *)buf, CFI_attribute_other, CFI_type_int, 0, 1, extents));
/* result shall be the address of a C descriptor with rank equal to the rank of source minus the number of zero strides. */ check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 0, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for rank mismatch (too small)\n"); bad ++; }
check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 1, NULL)); status = CFI_section (result, source, &lb, &lb, &zstep); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for rank mismatch (zero stride)\n"); bad ++; }
check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 3, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for rank mismatch (too large)\n"); bad ++; }
/* The attribute member [of result] shall have the value CFI_attribute_other or CFI_attribute_pointer. */ check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_allocatable, CFI_type_int, 0, 1, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for CFI_attribute_allocatable result\n"); bad ++; }
/* source shall be the address of a C descriptor that describes a nonallocatable nonpointer array, an allocated allocatable array, or an associated array pointer. */ check_CFI_status ("CFI_establish", CFI_establish (source, NULL, CFI_attribute_allocatable, CFI_type_int, 0, 1, NULL)); check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 1, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for unallocated allocatable source array\n"); bad ++; }
check_CFI_status ("CFI_establish", CFI_establish (source, NULL, CFI_attribute_pointer, CFI_type_int, 0, 1, NULL)); check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 1, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for unassociated pointer source array\n"); bad ++; }
/* The corresponding values of the elem_len and type members shall be the same in the C descriptors with the addresses source and result. */ check_CFI_status ("CFI_establish", CFI_establish (source, (void *)buf, CFI_attribute_other, CFI_type_struct, sizeof(int), 1, extents)); check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_struct, 2*sizeof (int), 1, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for elem_len mismatch\n"); bad ++; }
check_CFI_status ("CFI_establish", CFI_establish (result, NULL, CFI_attribute_pointer, CFI_type_int, 0, 1, NULL)); status = CFI_section (result, source, &lb, &ub, &step); if (status == CFI_SUCCESS) { fprintf (stderr, "no error for type mismatch\n"); bad ++; }
if (bad) abort (); }
|