/* Test the fix for PR89841.  */

/* Contributed by Reinhold Bader  <Bader@lrz.de> */

#include <ISO_Fortran_binding.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct
  {
    int i;
    float r[2];
  } cstruct;


int Psuba(CFI_cdesc_t *this, CFI_cdesc_t *that, int Dcase) {
    int status = 0;
    cstruct *cu;
    float *ct;
    CFI_dim_t *dim;
    if (this->elem_len != sizeof(float))
      {
	printf("FAIL: Dcase %i - this->elem_len %i\n",Dcase, (int) this->elem_len);
	status++;
      }
    if (this->type != CFI_type_float)
      {
	printf("FAIL: Dcase %i - this->type\n", Dcase);
	status++;
      }
    if (this->rank != 2)
      {
	printf("FAIL: Dcase %i - this->rank %i\n",Dcase,this->rank);
	status++;
      }
    if (this->attribute != CFI_attribute_other)
      {
	printf("FAIL: Dcase %i - this->attribute\n", Dcase);
	status++;
      }

    dim = this->dim;
    if (dim[0].lower_bound != 0 || dim[0].extent != 3) 
      {
	printf("FAIL: Dcase %i - dim[0] %i %i %i\n",Dcase, (int) dim[0].lower_bound,
	      (int)dim[0].extent,(int)dim[0].sm);
	status++;
      }
    if (dim[1].lower_bound != 0 || dim[1].extent != 7)
      {
	printf("FAIL: Dcase %i - dim[1] %i %i %i\n",Dcase,(int) dim[1].lower_bound,
	      (int) dim[1].extent,(int) dim[1].sm);
	status++;
      }

    if (that->elem_len != sizeof(cstruct))
      {
	printf("FAIL: Dcase %i - that->elem_len\n", Dcase);
	status++;
      }
    if (that->type != CFI_type_struct)
      {
	printf("FAIL: Dcase %i - that->type\n",Dcase);
	status++;
      }
     if (that->rank != 1)
      {
	printf("FAIL: Dcase %i - that->rank\n", Dcase);
	status++;
      }
    if (that->attribute != CFI_attribute_other)
      {
	printf("FAIL: Dcase %i - that->attribute %i\n",Dcase,that->attribute);
	status++;
      }

    dim = that->dim;
    if (dim[0].lower_bound != 0 || dim[0].extent != 1) 
      {
	printf("FAIL: Dcase %i - dim[0] %i %i\n",Dcase,(int)dim[0].lower_bound,dim[0].extent);
	status++;
      }

    cu = (cstruct *) ((CFI_cdesc_t *) that)->base_addr;
    if (cu->i != 4 || fabs(cu->r[1] -  2.2) > 1.0e-6)
      {
	printf("FAIL: Dcase %i - value of that %i %f %f\n",Dcase,cu->i,cu->r[0],cu->r[1]);
	status++;
      } 

    ct = (float *) ((CFI_cdesc_t *) this)->base_addr;
    if ( fabs(ct[5] +  2.0) > 1.0e-6)
      {
	printf("FAIL: Dcase %i - value of this %f\n",Dcase,ct[5]);
	status++;
      }
 
    return status;
}


