1// PR target/39002 2// { dg-do run } 3 4struct S 5{ 6 double x; 7 double y; 8 double z; 9}; 10 11double foo (S *, S *); 12void bar (S *, S *, S *, double &, double &, double &); 13 14double 15foo (S *a1, S *a2) 16{ 17 return __builtin_sqrt ((a1->x - a2->x) * (a1->x - a2->x) 18 + (a1->y - a2->y) * (a1->y - a2->y) 19 + (a1->z - a2->z) * (a1->z - a2->z)); 20} 21 22void 23bar (S *p, S *q, S *r, double &x, double &y, double &z) 24{ 25 if (foo (p, q) == 0.0) 26 { 27 x = r->x; 28 y = r->y; 29 z = r->z; 30 return; 31 } 32 if (foo (p, r) == 0.0) 33 { 34 x = r->x; 35 y = r->y; 36 z = r->z; 37 return; 38 } 39 if (foo (q, r) == 0.0) 40 { 41 x = r->x; 42 y = r->y; 43 z = r->z; 44 return; 45 } 46 47 double a1, b1, c1, d1, e1; 48 double dx, dy, dz, dw, dv; 49 50 a1 = q->x - p->x; 51 b1 = q->y - p->y; 52 c1 = q->z - p->z; 53 e1 = __builtin_sqrt (a1 * a1 + b1 * b1 + c1 * c1); 54 a1 = a1 / e1; 55 b1 = b1 / e1; 56 c1 = c1 / e1; 57 dx = p->x - r->x; 58 dy = p->y - r->y; 59 dz = p->z - r->z; 60 dw = dx * dx + dy * dy + dz * dz; 61 dv = 2.0 * dx * a1 + 2.0 * dy * b1 + 2.0 * dz * c1; 62 d1 = -dv / 2.0; 63 x = p->x + (a1 * d1); 64 y = p->y + (b1 * d1); 65 z = p->z + (c1 * d1); 66 return; 67} 68 69int 70main (void) 71{ 72 S a, b, c, d, *p, *q, *r; 73 74 p = &a; 75 q = &b; 76 r = &c; 77 a.x = 0.0; 78 a.y = 0.0; 79 a.z = 0.0; 80 b.x = 1.0; 81 b.y = 0.0; 82 b.z = 0.0; 83 c.x = 0.0; 84 c.y = 1.0; 85 c.z = 0.0; 86 bar (p, q, r, d.x, d.y, d.z); 87 return 0; 88} 89