aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template/ptrmem30.C
blob: 923238bec4d8f44b6ea89034a4e984c0eebaa1ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// PR c++/70096
// { dg-do run }

int read;

struct Holder
{
  void foo () { read = data; }
  int data;
};

void
poison_stack ()
{
  volatile char a[256];
  __builtin_memset ((void *)a, 0xa, sizeof a);
}

template <typename F>
void test1 ()
{
  Holder h;
  h.data = 42;
  F Holder::*fptr = &Holder::foo;
  (h.*fptr)();
}

template <typename F>
void test2 ()
{
  Holder h;
  h.data = 42;
  F Holder::*fptr1 = &Holder::foo;
  F Holder::*fptr2 = fptr1;
  (h.*fptr2)();
}


int main ()
{
  poison_stack ();
  test1<void()>();
  poison_stack ();
  test2<void()>();
}