PR c++/85739 - ICE with pointer to member template parm.
authorJason Merrill <jason@redhat.com>
Sun, 3 Jun 2018 12:37:03 +0000 (08:37 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 3 Jun 2018 12:37:03 +0000 (08:37 -0400)
* cvt.c (perform_qualification_conversions): Use cp_fold_convert.

From-SVN: r261129

gcc/cp/ChangeLog
gcc/cp/cvt.c
gcc/testsuite/g++.dg/template/ptrmem32.C [new file with mode: 0644]

index c661d46c99a72ad10bdc0de7ca18b830b01e5692..5d4caccdb39b4e18afa8c2189144c94ef0fb58e5 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/85739 - ICE with pointer to member template parm.
+       * cvt.c (perform_qualification_conversions): Use cp_fold_convert.
+
 2018-06-02  Jason Merrill  <jason@redhat.com>
 
        PR c++/85761 - ICE with ill-formed use of const outer variable.
index f29dacd685e89c7c137dd162b43f5ab69bd4b511..bca9d05af664b71ec87ef2b7963bc68058df0e9d 100644 (file)
@@ -1945,7 +1945,8 @@ can_convert_qual (tree type, tree expr)
 
 /* Attempt to perform qualification conversions on EXPR to convert it
    to TYPE.  Return the resulting expression, or error_mark_node if
-   the conversion was impossible.  */
+   the conversion was impossible.  Since this is only used by
+   convert_nontype_argument, we fold the conversion.  */
 
 tree
 perform_qualification_conversions (tree type, tree expr)
@@ -1957,7 +1958,7 @@ perform_qualification_conversions (tree type, tree expr)
   if (same_type_p (type, expr_type))
     return expr;
   else if (can_convert_qual (type, expr))
-    return build_nop (type, expr);
+    return cp_fold_convert (type, expr);
   else
     return error_mark_node;
 }
diff --git a/gcc/testsuite/g++.dg/template/ptrmem32.C b/gcc/testsuite/g++.dg/template/ptrmem32.C
new file mode 100644 (file)
index 0000000..edf2003
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/85739
+
+struct l { int k; };
+template <int l::*> class b { };
+template <const int l::*> class B { typedef int e; };
+template <int l::*i, const int l::*n>
+bool operator!=(B<n>, b<i>);
+
+bool bb = (B<&l::k>() != b<&l::k>());
+