aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2015-04-03 17:23:27 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2015-04-03 17:23:27 +0000
commita3d94329e909d9d14ba6a6cf9f398cdafc84da53 (patch)
tree94fa7053e0114e4946c451a921ae30f9a4e0c703
parent1dc15b0b9dd13b4ef6c7af420b2d3b6fe877d4a1 (diff)
downloadgcc-a3d94329e909d9d14ba6a6cf9f398cdafc84da53.zip
gcc-a3d94329e909d9d14ba6a6cf9f398cdafc84da53.tar.gz
gcc-a3d94329e909d9d14ba6a6cf9f398cdafc84da53.tar.bz2
re PR c++/64085 (ICE on C++14 lambda by-reference capture with an initializer)
/cp 2015-04-03 Paolo Carlini <paolo.carlini@oracle.com> PR c++/64085 * lambda.c (add_capture): Use dependent_type_p for capture by reference too. /testsuite 2015-04-03 Paolo Carlini <paolo.carlini@oracle.com> PR c++/64085 * g++.dg/cpp1y/lambda-init13.C: New. From-SVN: r221858
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/lambda.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/lambda-init13.C18
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index ca048aa..b84f337 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-03 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/64085
+ * lambda.c (add_capture): Use dependent_type_p for capture by
+ reference too.
+
2015-04-02 Marek Polacek <polacek@redhat.com>
PR c++/65642
diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c
index b160c8c..dd1c2d4 100644
--- a/gcc/cp/lambda.c
+++ b/gcc/cp/lambda.c
@@ -506,7 +506,7 @@ add_capture (tree lambda, tree id, tree orig_init, bool by_reference_p,
if (by_reference_p)
{
type = build_reference_type (type);
- if (!real_lvalue_p (initializer))
+ if (!dependent_type_p (type) && !real_lvalue_p (initializer))
error ("cannot capture %qE by reference", initializer);
}
else
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0810c13..3e87768 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-03 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/64085
+ * g++.dg/cpp1y/lambda-init13.C: New.
+
2015-04-03 Marek Polacek <polacek@redhat.com>
* g++.dg/cpp0x/pr57101.C: Use proper type for size_t.
diff --git a/gcc/testsuite/g++.dg/cpp1y/lambda-init13.C b/gcc/testsuite/g++.dg/cpp1y/lambda-init13.C
new file mode 100644
index 0000000..9b1d139
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp1y/lambda-init13.C
@@ -0,0 +1,18 @@
+// PR c++/64085
+// { dg-do compile { target c++14 } }
+
+template<typename T>
+struct reference_wrapper
+{
+ T& get() const noexcept;
+};
+
+template<class T>
+auto make_monad(reference_wrapper<T> arg) {
+ return [&captive = arg.get()](auto&&) { return 1; };
+}
+
+int main()
+{
+ make_monad(reference_wrapper<int&>());
+}