aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Carlini <paolo.carlini@oracle.com>2018-03-05 15:40:15 +0000
committerPaolo Carlini <paolo@gcc.gnu.org>2018-03-05 15:40:15 +0000
commit5625e74790579b589106e717dba7820933e541f1 (patch)
tree024dc9c2b60e4d0d63eeaa983a0a814b84156d75
parent800916ab502edfefa9efb455c0a9e6455dbdccf5 (diff)
downloadgcc-5625e74790579b589106e717dba7820933e541f1.zip
gcc-5625e74790579b589106e717dba7820933e541f1.tar.gz
gcc-5625e74790579b589106e717dba7820933e541f1.tar.bz2
re PR c++/84618 (ICE in build_capture_proxy, at cp/lambda.c:460)
/cp 2018-03-05 Paolo Carlini <paolo.carlini@oracle.com> PR c++/84618 * parser.c (cp_parser_lambda_introducer): Reject any capture not involving a VAR_DECL or a PARM_DECL. /testsuite 2018-03-05 Paolo Carlini <paolo.carlini@oracle.com> PR c++/84618 * g++.dg/cpp0x/lambda/lambda-ice29.C: New. * g++.dg/cpp0x/lambda/lambda-ice17.C: Adjust. * g++.dg/cpp0x/lambda/lambda-ice23.C: Likewise. From-SVN: r258250
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c12
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice17.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice23.C2
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice29.C8
6 files changed, 29 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e9b0e3b..5e16635 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2018-03-05 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/84618
+ * parser.c (cp_parser_lambda_introducer): Reject any capture not
+ involving a VAR_DECL or a PARM_DECL.
+
2018-03-05 Pádraig Brady <P@draigBrady.com>
Jason Merrill <jason@redhat.com>
Nathan Sidwell <nathan@acm.org>
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index e1acb07..460b5ea 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -10377,15 +10377,15 @@ cp_parser_lambda_introducer (cp_parser* parser, tree lambda_expr)
unqualified_name_lookup_error (capture_id);
continue;
}
- else if (DECL_P (capture_init_expr)
- && (!VAR_P (capture_init_expr)
- && TREE_CODE (capture_init_expr) != PARM_DECL))
+ else if (!VAR_P (capture_init_expr)
+ && TREE_CODE (capture_init_expr) != PARM_DECL)
{
error_at (capture_token->location,
- "capture of non-variable %qD ",
+ "capture of non-variable %qE ",
capture_init_expr);
- inform (DECL_SOURCE_LOCATION (capture_init_expr),
- "%q#D declared here", capture_init_expr);
+ if (DECL_P (capture_init_expr))
+ inform (DECL_SOURCE_LOCATION (capture_init_expr),
+ "%q#D declared here", capture_init_expr);
continue;
}
if (VAR_P (capture_init_expr)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 569f040..44543c31 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-05 Paolo Carlini <paolo.carlini@oracle.com>
+
+ PR c++/84618
+ * g++.dg/cpp0x/lambda/lambda-ice29.C: New.
+ * g++.dg/cpp0x/lambda/lambda-ice17.C: Adjust.
+ * g++.dg/cpp0x/lambda/lambda-ice23.C: Likewise.
+
2018-03-05 Olga Makhotina <olga.makhotina@intel.com>
* g++.dg/other/i386-2.C: Add -mpconfig and -mwbnoinvd.
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice17.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice17.C
index 57111fd..8d84b64 100644
--- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice17.C
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice17.C
@@ -5,7 +5,7 @@ void foo (int);
void foo (void)
{
- [&foo] // { dg-error "cannot capture" }
+ [&foo] // { dg-error "5:capture of non-variable" }
{
foo (0);
};
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice23.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice23.C
index b811ad2..4fd2db6 100644
--- a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice23.C
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice23.C
@@ -3,7 +3,7 @@
template <typename T>
constexpr int r(T x) {
- auto f = [r,x]() { return r(x); }; // { dg-error "incomplete type" }
+ auto f = [r,x]() { return r(x); }; // { dg-error "13:capture of non-variable" }
return 0;
}
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice29.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice29.C
new file mode 100644
index 0000000..80f5b38
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-ice29.C
@@ -0,0 +1,8 @@
+// PR c++/84618
+// { dg-do compile { target c++11 } }
+
+template <int>
+struct S {
+ void b() const;
+ void b() { [b] {}; } // { dg-error "15:capture of non-variable" }
+};