From b60244f6804ba9ded6ee6d1f17a8e4a728364135 Mon Sep 17 00:00:00 2001 From: ppalka Date: Tue, 22 Mar 2016 02:02:01 +0000 Subject: [PATCH] Fix PR c++/70096 (wrong code for pointer-to-member-function copy) gcc/cp/ChangeLog: PR c++/70096 * pt.c (tsubst_decl): Clear the DECL_MODE of the new decl. gcc/testsuite/ChangeLog: PR c++/70096 * g++.dg/template/ptrmem30.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234391 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 5 +++ gcc/cp/pt.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/template/ptrmem30.C | 45 ++++++++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/ptrmem30.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 578fc6fba358..adf0ddaa72f0 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2016-03-22 Patrick Palka + + PR c++/70096 + * pt.c (tsubst_decl): Clear the DECL_MODE of the new decl. + 2016-03-22 Patrick Palka PR c++/70204 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e8cfb660ad06..45cd1eaaf4fd 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -12374,6 +12374,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain) /* The initializer must not be expanded until it is required; see [temp.inst]. */ DECL_INITIAL (r) = NULL_TREE; + if (VAR_P (r)) + DECL_MODE (r) = VOIDmode; if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_WRTL)) SET_DECL_RTL (r, NULL); DECL_SIZE (r) = DECL_SIZE_UNIT (r) = 0; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69c97a7fa360..dc47ef1a8469 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-22 Patrick Palka + + PR c++/70096 + * g++.dg/template/ptrmem30.C: New test. + 2016-03-22 Patrick Palka PR c++/70204 diff --git a/gcc/testsuite/g++.dg/template/ptrmem30.C b/gcc/testsuite/g++.dg/template/ptrmem30.C new file mode 100644 index 000000000000..923238bec4d8 --- /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 +void test1 () +{ + Holder h; + h.data = 42; + F Holder::*fptr = &Holder::foo; + (h.*fptr)(); +} + +template +void test2 () +{ + Holder h; + h.data = 42; + F Holder::*fptr1 = &Holder::foo; + F Holder::*fptr2 = fptr1; + (h.*fptr2)(); +} + + +int main () +{ + poison_stack (); + test1(); + poison_stack (); + test2(); +} -- 2.47.3