/* This ICEd due to an incomplete fix for PR57993.  */
/* { dg-do compile } */
/* { dg-additional-options "-Wno-return-type" } */


extern "C"
{
  extern double sqrt (double __x) throw ();
  typedef long unsigned int size_t;
  typedef struct
  {
  }
  __mbstate_t;
  void *pov_malloc (size_t size, const char *file, int line, const char *msg);
  typedef struct Object_Struct OBJECT;
  typedef struct Ray_Struct RAY;
  typedef struct istack_struct ISTACK;
  typedef struct istk_entry INTERSECTION;
  typedef double UV_VECT[2];
  typedef double VECTOR[3];
  typedef struct Transform_Struct TRANSFORM;
  typedef struct Method_Struct METHODS;
  typedef int (*ALL_INTERSECTIONS_METHOD) (OBJECT *, RAY *, ISTACK *);
  typedef int (*INSIDE_METHOD) (VECTOR, OBJECT *);
  typedef void (*NORMAL_METHOD) (VECTOR, OBJECT *, INTERSECTION *);
  typedef void (*UVCOORD_METHOD) (UV_VECT, OBJECT *, INTERSECTION *);
  typedef void *(*COPY_METHOD) (OBJECT *);
  typedef void (*TRANSLATE_METHOD) (OBJECT *, VECTOR, TRANSFORM *);
  typedef void (*ROTATE_METHOD) (OBJECT *, VECTOR, TRANSFORM *);
  typedef void (*SCALE_METHOD) (OBJECT *, VECTOR, TRANSFORM *);
  typedef void (*TRANSFORM_METHOD) (OBJECT *, TRANSFORM *);
  typedef void (*INVERT_METHOD) (OBJECT *);
  typedef void (*DESTROY_METHOD) (OBJECT *);
  struct Method_Struct
  {
    ALL_INTERSECTIONS_METHOD All_Intersections_Method;
    INSIDE_METHOD Inside_Method;
    NORMAL_METHOD Normal_Method;
    UVCOORD_METHOD UVCoord_Method;
    COPY_METHOD Copy_Method;
    TRANSLATE_METHOD Translate_Method;
    ROTATE_METHOD Rotate_Method;
    SCALE_METHOD Scale_Method;
    TRANSFORM_METHOD Transform_Method;
    INVERT_METHOD Invert_Method;
    DESTROY_METHOD Destroy_Method;
  };
  typedef struct Bicubic_Patch_Struct BICUBIC_PATCH;
  typedef struct Bezier_Node_Struct BEZIER_NODE;
  struct Bezier_Node_Struct
  {
    int Node_Type;
    int Count;
  };
  struct Bicubic_Patch_Struct
  {
    METHODS *Methods;
    int Patch_Type, U_Steps, V_Steps;
    VECTOR Control_Points[4][4];
    BEZIER_NODE *Node_Tree;
  };
  typedef enum
  {
    CSV, SYS, PPM, TARGA, PNG, NONE
  }
  SHELLDATA;
  typedef enum STATS
  {
    Number_Of_Pixels =
      0, Number_Of_Pixels_Supersampled, Number_Of_Samples, Number_Of_Rays,
      Calls_To_DNoise, Calls_To_Noise, ADC_Saves, Istack_overflows,
      Ray_RBezier_Tests, Ray_RBezier_Tests_Succeeded, Ray_Bicubic_Tests,
      Ray_Bicubic_Tests_Succeeded, Ray_Blob_Tests, Ray_Blob_Tests_Succeeded,
      Blob_Element_Tests, Blob_Element_Tests_Succeeded, Blob_Bound_Tests,
      Blob_Bound_Tests_Succeeded, Ray_Box_Tests, Ray_Box_Tests_Succeeded,
      Ray_Cone_Tests, Ray_Cone_Tests_Succeeded, Ray_CSG_Intersection_Tests,
      Ray_CSG_Intersection_Tests_Succeeded, Ray_CSG_Merge_Tests,
      Ray_CSG_Merge_Tests_Succeeded, Ray_CSG_Union_Tests,
      Ray_CSG_Union_Tests_Succeeded, Ray_Disc_Tests, Ray_Disc_Tests_Succeeded,
      Ray_Fractal_Tests, Ray_Fractal_Tests_Succeeded, Ray_HField_Tests,
      Ray_HField_Tests_Succeeded, Ray_HField_Box_Tests,
      Ray_HField_Box_Tests_Succeeded, Ray_HField_Triangle_Tests,
      Ray_HField_Triangle_Tests_Succeeded, Ray_HField_Block_Tests,
      Ray_HField_Block_Tests_Succeeded, Ray_HField_Cell_Tests,
      Ray_HField_Cell_Tests_Succeeded, Ray_IsoSurface_Tests,
      Ray_IsoSurface_Tests_Succeeded, Ray_IsoSurface_Bound_Tests,
      Ray_IsoSurface_Bound_Tests_Succeeded, Ray_IsoSurface_Cache,
      Ray_IsoSurface_Cache_Succeeded, Ray_Lathe_Tests,
      Ray_Lathe_Tests_Succeeded, Lathe_Bound_Tests,
      Lathe_Bound_Tests_Succeeded, Ray_Mesh_Tests, Ray_Mesh_Tests_Succeeded,
      Ray_Plane_Tests, Ray_Plane_Tests_Succeeded, Ray_Polygon_Tests,
      Ray_Polygon_Tests_Succeeded, Ray_Prism_Tests, Ray_Prism_Tests_Succeeded,
      Prism_Bound_Tests, Prism_Bound_Tests_Succeeded, Ray_Parametric_Tests,
      Ray_Parametric_Tests_Succeeded, Ray_Par_Bound_Tests,
      Ray_Par_Bound_Tests_Succeeded, Ray_Quadric_Tests,
      Ray_Quadric_Tests_Succeeded, Ray_Poly_Tests, Ray_Poly_Tests_Succeeded,
      Ray_Sphere_Tests, Ray_Sphere_Tests_Succeeded, Ray_Sphere_Sweep_Tests,
      Ray_Sphere_Sweep_Tests_Succeeded, Ray_Superellipsoid_Tests,
      Ray_Superellipsoid_Tests_Succeeded, Ray_Sor_Tests,
      Ray_Sor_Tests_Succeeded, Sor_Bound_Tests, Sor_Bound_Tests_Succeeded,
      Ray_Torus_Tests, Ray_Torus_Tests_Succeeded, Torus_Bound_Tests,
      Torus_Bound_Tests_Succeeded, Ray_Triangle_Tests,
      Ray_Triangle_Tests_Succeeded, Ray_TTF_Tests, Ray_TTF_Tests_Succeeded,
      Bounding_Region_Tests, Bounding_Region_Tests_Succeeded,
      Clipping_Region_Tests, Clipping_Region_Tests_Succeeded,
      Ray_IsoSurface_Find_Root, Ray_Function_VM_Calls,
      Ray_Function_VM_Instruction_Est, VBuffer_Tests, VBuffer_Tests_Succeeded,
      LBuffer_Tests, LBuffer_Tests_Succeeded, Media_Samples, Media_Intervals,
      Reflected_Rays_Traced, Refracted_Rays_Traced, Transmitted_Rays_Traced,
      Internal_Reflected_Rays_Traced, Shadow_Cache_Hits,
      Shadow_Rays_Succeeded, Shadow_Ray_Tests, nChecked, nEnqueued,
      totalQueues, totalQueueResets, totalQueueResizes, Polynomials_Tested,
      Roots_Eliminated, MemStat_Smallest_Alloc, MemStat_Largest_Alloc,
      MemStat_Largest_Mem_Usage, Number_Of_Photons_Shot,
      Number_Of_Photons_Stored, Number_Of_Global_Photons_Stored,
      Number_Of_Media_Photons_Stored, Priority_Queue_Add,
      Priority_Queue_Remove, Gather_Performed_Count, Gather_Expanded_Count,
      MaxStat
  }
  Stats;
  static int All_Bicubic_Patch_Intersections (OBJECT * Object, RAY * Ray,
					      ISTACK * Depth_Stack);
  static int Inside_Bicubic_Patch (VECTOR IPoint, OBJECT * Object) { return 0; }
  static void Bicubic_Patch_Normal (VECTOR Result, OBJECT * Object,
				    INTERSECTION * Inter) {}
  static void Bicubic_Patch_UVCoord (UV_VECT Result, OBJECT * Object,
				     INTERSECTION * Inter) {}
  static BICUBIC_PATCH *Copy_Bicubic_Patch (OBJECT * Object) { return 0; }
  static void Translate_Bicubic_Patch (OBJECT * Object, VECTOR Vector,
				       TRANSFORM * Trans) {}
  static void Rotate_Bicubic_Patch (OBJECT * Object, VECTOR Vector,
				    TRANSFORM * Trans) {}
  static void Scale_Bicubic_Patch (OBJECT * Object, VECTOR Vector,
				   TRANSFORM * Trans) {}
  static void Transform_Bicubic_Patch (OBJECT * Object, TRANSFORM * Trans) {}
  static void Invert_Bicubic_Patch (OBJECT * Object) {}
  static void Destroy_Bicubic_Patch (OBJECT * Object) {}
  static METHODS Bicubic_Patch_Methods = {
    All_Bicubic_Patch_Intersections, Inside_Bicubic_Patch,
      Bicubic_Patch_Normal, Bicubic_Patch_UVCoord,
      (COPY_METHOD) Copy_Bicubic_Patch, Translate_Bicubic_Patch,
      Rotate_Bicubic_Patch, Scale_Bicubic_Patch, Transform_Bicubic_Patch,
      Invert_Bicubic_Patch, Destroy_Bicubic_Patch
  };
  static void bezier_value (VECTOR (*Control_Points)[4][4], double u0,
			    double v0, VECTOR P, VECTOR N)
  {
    int i, j;
    double c, t, ut, vt;
    double u[4], uu[4], v[4], vv[4];
    double du[4], duu[4], dv[4], dvv[4];
    for (i = 1; i < 4; i++)
      {
	vv[i] = vv[i - 1] * (1.0 - v0);
	dvv[i] = -i * vv[i - 1];
      }
    for (i = 0; i < 4; i++)
      {
	for (j = 0; j < 4; j++)
	  {
	    t = c * ut * (dv[j] * vv[3 - j] + v[j] * dvv[3 - j]);
	  }
	t = 1.0 / sqrt (t);
      }
  }
  static int intersect_subpatch (BICUBIC_PATCH * Shape, RAY * ray,
				 VECTOR V1[3], double uu[3], double vv[3],
				 double *Depth, VECTOR P, VECTOR N, double *u,
				 double *v)
  {
    VECTOR Q, T1;
    VECTOR B[3], IB[3], NN[3];
    bezier_value ((VECTOR (*)[4][4]) & Shape->Control_Points, uu[1], vv[1],
		  T1, NN[1]);
  }
  static int bezier_tree_walker (RAY * Ray, BICUBIC_PATCH * Shape,
				 BEZIER_NODE * Node, ISTACK * Depth_Stack)
  {
    int i, cnt = 0;
    double Depth, u, v;
    double uu[3], vv[3];
    VECTOR N, P;
    VECTOR V1[3];
    if (Node->Node_Type == 0)
      {
	for (i = 0; i < Node->Count; i++)
	  {
	  }
	if (intersect_subpatch (Shape, Ray, V1, uu, vv, &Depth, P, N, &u, &v))
	  {
	  }
      }
  }
  static int All_Bicubic_Patch_Intersections (OBJECT * Object, RAY * Ray,
					      ISTACK * Depth_Stack)
  {
    int Found, cnt = 0;
    switch (((BICUBIC_PATCH *) Object)->Patch_Type)
      {
      case 1:
	cnt =
	  bezier_tree_walker (Ray, (BICUBIC_PATCH *) Object,
			      ((BICUBIC_PATCH *) Object)->Node_Tree,
			      Depth_Stack);
      }
  }
  BICUBIC_PATCH *Create_Bicubic_Patch ()
  {
    BICUBIC_PATCH *New;
    New =
      (BICUBIC_PATCH *) pov_malloc ((sizeof (BICUBIC_PATCH)), "bezier.cpp",
				    2079, ("bicubic patch"));
    New->Methods = &Bicubic_Patch_Methods;
  }
}
