aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/template/ptrmem30.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/template/ptrmem30.C')
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem30.C45
1 files changed, 45 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/template/ptrmem30.C b/gcc/testsuite/g++.dg/template/ptrmem30.C
new file mode 100644
index 00000000000..923238bec4d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem30.C
@@ -0,0 +1,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()>();
+}