2018-11-07 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / testsuite / g++.dg / torture / pr71230.C
blob40ce55a6acc32a19e821e3ced138249f1730b325
1 // { dg-do compile }
2 // { dg-additional-options "-ffast-math" }
4 template <int rank, int dim> class Tensor;
5 template <int dim> class Point {
6 public:
7     Point (const double x, const double y, const double z);
8     double operator () (const unsigned int index) const;
9 };
10 template <int celldim, int dim> class TriaObjectAccessor  {
11     Point<dim> & vertex (const unsigned int i) const;
12     Point<dim> barycenter (double, double, double, double, double) const;
14 template <> Point<3> TriaObjectAccessor<3, 3>::barycenter (double s6, double s7, double s1, double s2, double s3) const
16     const double x[8] = {
17         vertex(0)(0),    vertex(1)(0),    vertex(2)(0),    vertex(3)(0),    vertex(4)(0),    vertex(5)(0),    vertex(6)(0),    vertex(7)(0) };
18     const double y[8] = {
19         vertex(0)(1),    vertex(1)(1),    vertex(2)(1),    vertex(3)(1),    vertex(4)(1),    vertex(5)(1),    vertex(6)(1),    vertex(7)(1) };
20     const double z[8] = {
21         vertex(0)(2),    vertex(1)(2),    vertex(2)(2),    vertex(3)(2),    vertex(4)(2),    vertex(5)(2),    vertex(6)(2),    vertex(7)(2) };
22     double s4, s5, s8;
23     const double unknown0 = s1*s2;
24     const double unknown1 = s1*s2;
25     s8 = -z[2]*x[1]*y[2]*z[5]+z[2]*y[1]*x[2]*z[5]-z[2]*z[1]*x[2]*y[5]+z[2]*z        [1]*x[5]*y[2]+2.0*y[5]*x[7]*z[4]*z[4]-y[1]*x[2]*z[0]*z[0]+x[0]*y[3]*z[7]*z[7]        -2.0*z[5]*z[5]*x[4]*y[1]+2.0*z[5]*z[5]*x[1]*y[4]+z[5]*z[5]*x[0]*y[4]-2.0*z[2]*z        [2]*x[1]*y[3]+2.0*z[2]*z[2]*x[3]*y[1]-x[0]*y[4]*z[7]*z[7]-y[0]*x[3]*z[7]*z[7]+x        [1]*y[0]*z[5]*z[5];
26     s5 = s8+z[2]*x[6]*y[2]*z[5]-z[2]*x[5]*y[2]*z[6]-z[2]*x[2]*y[3]*z[7]-x[2]*        y[3]*z[7]*z[7]+2.0*z[2]*x[2]*y[3]*z[1]-z[2]*y[2]*x[3]*z[0]+z[2]*y[2]*x[0]*z[3]-        z[2]*x[2]*y[0]*z[3]-z[7]*y[2]*x[7]*z[3]+z[7]*z[2]*x[7]*y[3]+z[7]*x[2]*y[7]*z[3]        +z[6]*y[1]*x[2]*z[5]-z[6]*x[1]*y[2]*z[5]+z[5]*x[1]*y[5]*z[2]+s6+s7;
27     s4 = 1/s5;
28     s2 = s3*s4;
29     const double unknown2 = s1*s2;
30     return Point<3> (unknown0, unknown1, unknown2);