~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/ld/testsuite/ld-plugin/pr13066.cc

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
 
 
3
template <typename V> struct S
 
4
{
 
5
  V *f, *l;
 
6
  __attribute__ ((noinline)) S (void) { f = 0, l = 0; }
 
7
  void foo (V *x)
 
8
  {
 
9
    if (x->p != 0)
 
10
      x->p->n = x->n;
 
11
    else
 
12
      f = x->n;
 
13
    if (x->n != 0)
 
14
      x->n->p = x->p;
 
15
    else
 
16
      l = x->p;
 
17
  }
 
18
  __attribute__ ((noinline)) void bar (V *x)
 
19
  {
 
20
    x->n = 0;
 
21
    x->p = l;
 
22
    if (l != 0)
 
23
      l->n = x;
 
24
    else
 
25
      f = x;
 
26
    l = x;
 
27
  }
 
28
};
 
29
 
 
30
struct H;
 
31
 
 
32
struct A
 
33
{
 
34
  S <H> k;
 
35
};
 
36
 
 
37
struct H
 
38
{
 
39
  A *a;
 
40
  H *p, *n;
 
41
  __attribute__ ((noinline)) H (void) { p = 0, n = 0, a = 0; }
 
42
  __attribute__ ((noinline)) H (A *b) : a (b)
 
43
  {
 
44
    p = 0;
 
45
    n = 0;
 
46
    if (a != 0)
 
47
      a->k.bar (this);
 
48
  }
 
49
  __attribute__ ((noinline)) H (const H &h) : a (h.a)
 
50
  {
 
51
    p = 0;
 
52
    n = 0;
 
53
    if (a != 0)
 
54
      a->k.bar (this);
 
55
  }
 
56
  ~H (void) { if (a != 0) a->k.foo (this); }
 
57
  H &operator= (const H &o)
 
58
  {
 
59
    if (a != 0 || &o == this)
 
60
      __builtin_abort ();
 
61
    a = o.a;
 
62
    if (a != 0)
 
63
      a->k.bar (this);
 
64
    return *this;
 
65
  }
 
66
};
 
67
 
 
68
__attribute__ ((noinline))
 
69
H baz (void)
 
70
{
 
71
  return H (new A);
 
72
}
 
73
 
 
74
H g;
 
75
 
 
76
int
 
77
main (void)
 
78
{
 
79
  g = baz ();
 
80
  if (g.a->k.f != &g)
 
81
    __builtin_abort ();
 
82
  printf ("OK\n");
 
83
  return 0;
 
84
}
 
85