aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-08-21 14:33:07 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-08-21 14:33:07 -0400
commit7717e0f19e46c0accd55b48b67d0408f037b4a7a (patch)
tree9ce9e3c332b9ac7a95e7ca2f28488c84378c7924
parentf291336269664e5a89c94335c30dfed38142803f (diff)
downloadgcc-7717e0f19e46c0accd55b48b67d0408f037b4a7a.zip
gcc-7717e0f19e46c0accd55b48b67d0408f037b4a7a.tar.gz
gcc-7717e0f19e46c0accd55b48b67d0408f037b4a7a.tar.bz2
re PR c++/67240 ([concepts] Implicit conversion constraints are not respected)
PR c++/67240 * constraint.cc (satisfy_implicit_conversion_constraint): Also check for NULL_TREE. From-SVN: r227081
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/constraint.cc2
-rw-r--r--gcc/testsuite/g++.dg/concepts/iconv1.C20
3 files changed, 27 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index bc613f0..c2a1206 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-21 Jason Merrill <jason@redhat.com>
+
+ PR c++/67240
+ * constraint.cc (satisfy_implicit_conversion_constraint): Also
+ check for NULL_TREE.
+
2015-08-21 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (grokvardecl): Simplify the latter.
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index c981212..cb82535 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -1775,7 +1775,7 @@ satisfy_implicit_conversion_constraint (tree t, tree args,
of the form TYPE <unspecified> = EXPR. */
tree conv =
perform_direct_initialization_if_possible (type, expr, false, complain);
- if (conv == error_mark_node)
+ if (conv == NULL_TREE || conv == error_mark_node)
return boolean_false_node;
else
return boolean_true_node;
diff --git a/gcc/testsuite/g++.dg/concepts/iconv1.C b/gcc/testsuite/g++.dg/concepts/iconv1.C
new file mode 100644
index 0000000..c4dd38f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/concepts/iconv1.C
@@ -0,0 +1,20 @@
+// PR c++/67240
+// { dg-options -std=c++1z }
+
+int foo(int x)
+{
+ return x;
+}
+
+template <typename T>
+concept bool C1 = requires (T x) {
+ {foo(x)} -> int&;
+};
+
+template <typename T>
+concept bool C2 = requires (T x) {
+ {foo(x)} -> void;
+};
+
+static_assert( C1<int> ); // { dg-error "assert" }
+static_assert( C2<int> ); // { dg-error "assert" }