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