PR c++/51476 - ICE on PTRMEM_CST as template argument in c++11
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Dec 2011 08:46:13 +0000 (08:46 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 14 Dec 2011 08:46:13 +0000 (08:46 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182324 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/ptrmem-cst-arg1.C [new file with mode: 0644]

index d326133..5b818e9 100644 (file)
@@ -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
index 3b0cb23..66d4c3f 100644 (file)
@@ -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)
index e22d114..93c7377 100644 (file)
@@ -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 (file)
index 0000000..b6c81d5
--- /dev/null
@@ -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" }
+};