| // PR target/39002 |
| // { dg-do run } |
| |
| struct S |
| { |
| double x; |
| double y; |
| double z; |
| }; |
| |
| double foo (S *, S *); |
| void bar (S *, S *, S *, double &, double &, double &); |
| |
| double |
| foo (S *a1, S *a2) |
| { |
| return __builtin_sqrt ((a1->x - a2->x) * (a1->x - a2->x) |
| + (a1->y - a2->y) * (a1->y - a2->y) |
| + (a1->z - a2->z) * (a1->z - a2->z)); |
| } |
| |
| void |
| bar (S *p, S *q, S *r, double &x, double &y, double &z) |
| { |
| if (foo (p, q) == 0.0) |
| { |
| x = r->x; |
| y = r->y; |
| z = r->z; |
| return; |
| } |
| if (foo (p, r) == 0.0) |
| { |
| x = r->x; |
| y = r->y; |
| z = r->z; |
| return; |
| } |
| if (foo (q, r) == 0.0) |
| { |
| x = r->x; |
| y = r->y; |
| z = r->z; |
| return; |
| } |
| |
| double a1, b1, c1, d1, e1; |
| double dx, dy, dz, dw, dv; |
| |
| a1 = q->x - p->x; |
| b1 = q->y - p->y; |
| c1 = q->z - p->z; |
| e1 = __builtin_sqrt (a1 * a1 + b1 * b1 + c1 * c1); |
| a1 = a1 / e1; |
| b1 = b1 / e1; |
| c1 = c1 / e1; |
| dx = p->x - r->x; |
| dy = p->y - r->y; |
| dz = p->z - r->z; |
| dw = dx * dx + dy * dy + dz * dz; |
| dv = 2.0 * dx * a1 + 2.0 * dy * b1 + 2.0 * dz * c1; |
| d1 = -dv / 2.0; |
| x = p->x + (a1 * d1); |
| y = p->y + (b1 * d1); |
| z = p->z + (c1 * d1); |
| return; |
| } |
| |
| int |
| main (void) |
| { |
| S a, b, c, d, *p, *q, *r; |
| |
| p = &a; |
| q = &b; |
| r = &c; |
| a.x = 0.0; |
| a.y = 0.0; |
| a.z = 0.0; |
| b.x = 1.0; |
| b.y = 0.0; |
| b.z = 0.0; |
| c.x = 0.0; |
| c.y = 1.0; |
| c.z = 0.0; |
| bar (p, q, r, d.x, d.y, d.z); |
| return 0; |
| } |