aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2016-05-18 14:18:06 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2016-05-18 14:18:06 +0000
commit20309c6e2f8a3dcd1edb66f8f95669e174183403 (patch)
treeb95d6329a32b4edf3fe448b86af19c2961d2ca67 /gcc
parent50c78b9ab33d5f81b5f175621d56ba10f234cd37 (diff)
downloadgcc-20309c6e2f8a3dcd1edb66f8f95669e174183403.zip
gcc-20309c6e2f8a3dcd1edb66f8f95669e174183403.tar.gz
gcc-20309c6e2f8a3dcd1edb66f8f95669e174183403.tar.bz2
re PR c++/70466 ([ICE on invalid code in tree check: expected constructor, have parm_decl in convert_like_real, at cp/call.c:6371 with -std=c++11)
/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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/template/pr70466-1.C27
-rw-r--r--gcc/testsuite/g++.dg/template/pr70466-2.C25
5 files changed, 66 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1884bc9..4dc6755 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 0b59c40..729b7eb 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -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)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d77545d..e06f7e47 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..7eb83ea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr70466-1.C
@@ -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
index 0000000..7a7458a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/pr70466-2.C
@@ -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;
+}