re PR c++/43079 (ICE with incompatible pointer-to-member-function as template parameter)
authorJason Merrill <jason@redhat.com>
Wed, 17 Feb 2010 22:51:25 +0000 (17:51 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 17 Feb 2010 22:51:25 +0000 (17:51 -0500)
PR c++/43079
* pt.c (convert_nontype_argument): Change assert to test.

From-SVN: r156839

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

index 4a7b125..40d7334 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/43079
+       * pt.c (convert_nontype_argument): Change assert to test.
+
 2010-02-16  Jason Merrill  <jason@redhat.com>
 
        * cp-gimplify.c (cp_gimplify_expr): Fix error recovery.
index 43cd105..0165a7d 100644 (file)
@@ -5128,12 +5128,13 @@ convert_nontype_argument (tree type, tree expr)
         provide a superior diagnostic.  */
       if (!same_type_p (TREE_TYPE (expr), type))
        {
-         /* Make sure we are just one standard conversion off.  */
-         gcc_assert (can_convert (type, TREE_TYPE (expr)));
          error ("%qE is not a valid template argument for type %qT "
                 "because it is of type %qT", expr, type,
                 TREE_TYPE (expr));
-         inform (input_location, "standard conversions are not allowed in this context");
+         /* If we are just one standard conversion off, explain.  */
+         if (can_convert (type, TREE_TYPE (expr)))
+           inform (input_location,
+                   "standard conversions are not allowed in this context");
          return NULL_TREE;
        }
     }
index e03a469..87e442e 100644 (file)
@@ -1,3 +1,8 @@
+2010-02-17  Jason Merrill  <jason@redhat.com>
+
+       PR c++/43079
+       * g++.dg/template/ptrmem20.C: New.
+
 2010-02-17  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/43103
diff --git a/gcc/testsuite/g++.dg/template/ptrmem20.C b/gcc/testsuite/g++.dg/template/ptrmem20.C
new file mode 100644 (file)
index 0000000..d98ef39
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/43079
+
+struct A {};
+
+struct B
+{
+  void foo() const;
+  void foo();
+};
+
+template<void (A::*)()> void bar();
+
+void baz()
+{
+  bar<&B::foo>();  // { dg-error "not a valid template argument|no match" }
+}