aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2011-12-14 08:46:13 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2011-12-14 09:46:13 +0100
commit56f05abd0f957e41edf3ad3bfd8850c90d1fd89d (patch)
treec30b95dbc4bdcc21fe4fe879a305fe5b07a240c4 /gcc
parent58fc93fb001225df27cb502d0d5f4f939f0dc0aa (diff)
downloadgcc-56f05abd0f957e41edf3ad3bfd8850c90d1fd89d.zip
gcc-56f05abd0f957e41edf3ad3bfd8850c90d1fd89d.tar.gz
gcc-56f05abd0f957e41edf3ad3bfd8850c90d1fd89d.tar.bz2
PR c++/51476 - ICE on PTRMEM_CST as template argument in c++11
gcc/cp/ PR c++/51476 * pt.c (convert_nontype_argument): Don't call maybe_constant_value for PTRMEM_CST nodes. gcc/testsuite/ PR c++/51476 * g++.dg/cpp0x/ptrmem-cst-arg1.C: New test. From-SVN: r182324
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C9
4 files changed, 27 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d326133..5b818e9 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-12-14 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/51476
+ * pt.c (convert_nontype_argument): Don't call maybe_constant_value
+ for PTRMEM_CST nodes.
+
2011-12-13 Jason Merrill <jason@redhat.com>
PR c++/51406
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 3b0cb23..66d4c3f 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -5720,11 +5720,15 @@ convert_nontype_argument (tree type, tree expr, tsubst_flags_t complain)
to a null value, but otherwise still need to be of a specific form. */
if (cxx_dialect >= cxx0x)
{
- if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
+ if (TREE_CODE (expr) == PTRMEM_CST)
+ /* A PTRMEM_CST is already constant, and a valid template
+ argument for a parameter of pointer to member type, we just want
+ to leave it in that form rather than lower it to a
+ CONSTRUCTOR. */;
+ else if (INTEGRAL_OR_ENUMERATION_TYPE_P (type))
expr = maybe_constant_value (expr);
else if (TYPE_PTR_P (type)
- || (TYPE_PTR_TO_MEMBER_P (type)
- && TREE_CODE (expr) != PTRMEM_CST))
+ || TYPE_PTR_TO_MEMBER_P (type))
{
tree folded = maybe_constant_value (expr);
if (TYPE_PTR_P (type) ? integer_zerop (folded)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e22d114..93c7377 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-14 Dodji Seketeli <dodji@redhat.com>
+
+ PR c++/51476
+ * g++.dg/cpp0x/ptrmem-cst-arg1.C: New test.
+
2011-12-13 Jason Merrill <jason@redhat.com>
PR c++/51406
diff --git a/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C b/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
new file mode 100644
index 0000000..b6c81d5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C
@@ -0,0 +1,9 @@
+// Origin PR c++/51476
+// { dg-options "-std=c++11" }
+
+template<int> struct A {};
+struct B
+{
+ int i;
+ A<&B::i> a; // { dg-error "could not convert template argument" }
+};