blob: 7eb815ea31bd2da1914ef0fcf891e10b640f6dc6 [file] [log] [blame]
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ISO_Fortran_binding.h>
#include "dump-descriptors.h"
/* Source is an array of structs. */
struct ss {
int i, j;
char c[16];
double _Complex dc;
} s[10];
CFI_index_t extents[] = {10};
/* External entry point. */
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;
/* Create a descriptor for the source array. */
check_CFI_status ("CFI_establish",
CFI_establish (source, (void *)s, CFI_attribute_other,
CFI_type_struct,
sizeof (struct ss), 1, extents));
/* 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_select_part (result, source, offsetof (struct ss, j), 0);
if (status == CFI_SUCCESS)
{
fprintf (stderr,
"no error for CFI_attribute_allocatable result\n");
bad ++;
}
/* The rank member of the result C descriptor shall have the same value
as the rank member of the C descriptor at the address specified
by source. */
check_CFI_status ("CFI_establish",
CFI_establish (result, NULL, CFI_attribute_pointer,
CFI_type_int, 0, 0, NULL));
status = CFI_select_part (result, source, offsetof (struct ss, j), 0);
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, 3, NULL));
status = CFI_select_part (result, source, offsetof (struct ss, j), 0);
if (status == CFI_SUCCESS)
{
fprintf (stderr,
"no error for rank mismatch (too large)\n");
bad ++;
}
/* The value of displacement shall be between 0 and source->elem_len - 1
inclusive. */
check_CFI_status ("CFI_establish",
CFI_establish (result, NULL, CFI_attribute_pointer,
CFI_type_int, 0, 1, NULL));
status = CFI_select_part (result, source, -8, 0);
if (status == CFI_SUCCESS)
{
fprintf (stderr,
"no error for negative displacement\n");
bad ++;
}
status = CFI_select_part (result, source, source->elem_len, 0);
if (status == CFI_SUCCESS)
{
fprintf (stderr,
"no error for too-large displacement\n");
bad ++;
}
/* source shall be the address of a C descriptor for 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_struct,
sizeof (struct ss), 1, NULL));
status = CFI_select_part (result, source, offsetof (struct ss, j), 0);
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_struct,
sizeof (struct ss), 1, NULL));
status = CFI_select_part (result, source, offsetof (struct ss, j), 0);
if (status == CFI_SUCCESS)
{
fprintf (stderr,
"no error for unassociated pointer source array\n");
bad ++;
}
if (bad)
abort ();
}