aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-06-16 07:50:14 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-06-16 07:50:14 -0400
commit6e0681b715c3fb0c5ff87270f04f7bbd2eefa7b5 (patch)
tree082ba5b742f3076263d9566e94489a6d7949f4a5
parent949bd6c8ce34292ed83d80294d609835084947c7 (diff)
downloadgcc-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/ChangeLog3
-rw-r--r--gcc/cp/pt.c4
-rw-r--r--gcc/testsuite/g++.dg/template/ptrmem28.C10
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); }
+};