re PR c++/70466 ([ICE on invalid code in tree check: expected constructor, have parm_...
authorPaolo Carlini <paolo.carlini@oracle.com>
Wed, 18 May 2016 14:18:06 +0000 (14:18 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Wed, 18 May 2016 14:18:06 +0000 (14:18 +0000)
/cp
2016-05-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/70466
* call.c (convert_like_real): Check that we are actually converting
from an init list.

/testsuite
2016-05-18  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/70466
* g++.dg/template/pr70466-1.C: New.
* g++.dg/template/pr70466-2.C: Likewise.

From-SVN: r236395

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/pr70466-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/pr70466-2.C [new file with mode: 0644]

index 1884bc9c52d4a131873710f4de26ce28ca294caf..4dc67551c851c149164d900e7a630630aa937e17 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/70466
+       * call.c (convert_like_real): Check that we are actually converting
+       from an init list.
+
 2016-05-16  Matthew Wahab  <matthew.wahab@arm.com>
 
        * decl.c (grokdeclarator): Remove errmsg and use of
index 0b59c403b31be5ca18a64767c665fbd3544f8302..729b7eb4ba3c8810c16771f29bed3e8ae52212b0 100644 (file)
@@ -6377,8 +6377,9 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum,
        /* When converting from an init list we consider explicit
           constructors, but actually trying to call one is an error.  */
        if (DECL_NONCONVERTING_P (convfn) && DECL_CONSTRUCTOR_P (convfn)
+           && BRACE_ENCLOSED_INITIALIZER_P (expr)
            /* Unless this is for direct-list-initialization.  */
-           && !DIRECT_LIST_INIT_P (expr)
+           && !CONSTRUCTOR_IS_DIRECT_INIT (expr)
            /* And in C++98 a default constructor can't be explicit.  */
            && cxx_dialect >= cxx11)
          {
index d77545d03bde055d8aa5135624662637caeb4f27..e06f7e4734a6f0764164b30e8833e0dc21a1317a 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-18  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/70466
+       * g++.dg/template/pr70466-1.C: New.
+       * g++.dg/template/pr70466-2.C: Likewise.
+
 2016-05-18  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        * gcc.target/powerpc/p9-splat-1.c: New tests for ISA 3.0 word
diff --git a/gcc/testsuite/g++.dg/template/pr70466-1.C b/gcc/testsuite/g++.dg/template/pr70466-1.C
new file mode 100644 (file)
index 0000000..7eb83ea
--- /dev/null
@@ -0,0 +1,27 @@
+// PR c++/70466
+
+template < class T, class T >  // { dg-error "conflicting" }
+class A
+{
+public:
+  explicit A (T (S::*f) ()) {}  // { dg-error "expected" }
+};
+
+template < class T, class S > 
+A < T, S > foo (T (S::*f) ())
+{
+  return A < T, S > (f);
+}
+
+class B
+{
+public:
+  void bar () {}
+};
+
+int
+main ()
+{
+  foo (&B::bar);
+  return 0;
+}
diff --git a/gcc/testsuite/g++.dg/template/pr70466-2.C b/gcc/testsuite/g++.dg/template/pr70466-2.C
new file mode 100644 (file)
index 0000000..7a7458a
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/70466
+
+template < class T, class S >
+struct A
+{
+  explicit A (...) {}
+};
+
+template < class T, class S >
+A < T, S > foo (T (S::*f) ())
+{
+  return A < T, S > (f);
+}
+
+struct B
+{
+  void bar () {}
+};
+
+int
+main ()
+{
+  foo (&B::bar);
+  return 0;
+}