1 /* Test the fix of PR89846.
2 
3 Contributed by Reinhold Bader  <Bader@lrz.de>#include <stdio.h> */
4 
5 #include <stdlib.h>
6 #include <stddef.h>
7 #include <stdio.h>
8 #include "../../../libgfortran/ISO_Fortran_binding.h"
9 
10 typedef struct
11 {
12   char n;
13   float r[2];
14 } t1;
15 
16 typedef struct
17 {
18   long int i;
19   t1 t1;
20 } t2;
21 
22 
23 
24 void ta0(CFI_cdesc_t *);
25 void ta1(CFI_cdesc_t *);
26 
ti(CFI_cdesc_t * this,int flag)27 void ti(CFI_cdesc_t *this, int flag)
28 {
29   int status;
30   size_t dis;
31   CFI_CDESC_T(1) that;
32   t1 *ans;
33 
34   switch (flag)
35     {
36     case 0:
37       dis = offsetof(t2, t1);
38       status = CFI_establish((CFI_cdesc_t *) &that, NULL, CFI_attribute_other,
39 			     CFI_type_struct, sizeof(t1), 1, NULL);
40       if (status != CFI_SUCCESS)
41 	{
42 	  printf("FAIL 1 establish: nonzero status %i\n",status);
43           exit(1);
44 	}
45       status = CFI_select_part((CFI_cdesc_t *) &that, this, dis, 0);
46       if (status != CFI_SUCCESS)
47 	{
48 	  printf("FAIL C1: nonzero status %i\n",status);
49 	  exit(1);
50 	}
51      break;
52 
53     case 1:
54       dis = offsetof(t2, i);
55       status = CFI_establish((CFI_cdesc_t *) &that, NULL, CFI_attribute_other,
56 			     CFI_type_long, 0, 1, NULL);
57       if (status != CFI_SUCCESS)
58 	{
59 	  printf("FAIL 2 establish: nonzero status %i\n",status);
60 	  exit(1);
61 	}
62       status = CFI_select_part((CFI_cdesc_t *) &that, this, dis, 0);
63       if (status != CFI_SUCCESS)
64 	{
65 	  printf("FAIL C2: nonzero status %i\n",status);
66 	  exit(1);
67 	}
68     }
69 
70   if (CFI_is_contiguous((CFI_cdesc_t *) &that))
71     {
72       printf("FAIL C: contiguity for flag value %i - is %i\n",flag,
73 	     CFI_is_contiguous((CFI_cdesc_t *) &that));
74     }
75 
76   if (flag == 0) ta0((CFI_cdesc_t *) &that);
77   if (flag == 1) ta1((CFI_cdesc_t *) &that);
78 }
79