diff options
author | Jason Merrill <jason@redhat.com> | 2014-06-16 07:50:14 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-06-16 07:50:14 -0400 |
commit | 6e0681b715c3fb0c5ff87270f04f7bbd2eefa7b5 (patch) | |
tree | 082ba5b742f3076263d9566e94489a6d7949f4a5 | |
parent | 949bd6c8ce34292ed83d80294d609835084947c7 (diff) | |
download | gcc-6e0681b715c3fb0c5ff87270f04f7bbd2eefa7b5.zip gcc-6e0681b715c3fb0c5ff87270f04f7bbd2eefa7b5.tar.gz gcc-6e0681b715c3fb0c5ff87270f04f7bbd2eefa7b5.tar.bz2 |
re PR c++/61488 (Regression in template argument substitution in 4.9+)
PR c++/61488
* pt.c (check_valid_ptrmem_cst_expr): Fix for template context.
From-SVN: r211704
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/pt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ptrmem28.C | 10 |
3 files changed, 17 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index de0307d..422e716 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-06-13 Jason Merrill <jason@redhat.com> + PR c++/61488 + * pt.c (check_valid_ptrmem_cst_expr): Fix for template context. + PR c++/61500 * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8858908..df57293 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5350,6 +5350,10 @@ check_valid_ptrmem_cst_expr (tree type, tree expr, return true; if (cxx_dialect >= cxx11 && null_member_pointer_value_p (expr)) return true; + if (processing_template_decl + && TREE_CODE (expr) == ADDR_EXPR + && TREE_CODE (TREE_OPERAND (expr, 0)) == OFFSET_REF) + return true; if (complain & tf_error) { error ("%qE is not a valid template argument for type %qT", diff --git a/gcc/testsuite/g++.dg/template/ptrmem28.C b/gcc/testsuite/g++.dg/template/ptrmem28.C new file mode 100644 index 0000000..0379960 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem28.C @@ -0,0 +1,10 @@ +// PR c++/61488 + +struct A { + typedef int (A::*cont_func)(); + template <A::cont_func> void wait(int); + int notify(); + + void fix() { wait<&A::notify>(0); } // OK + template <int> void repair() { wait<&A::notify>(0); } +}; |