aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2015-06-19 14:37:41 -0400
committerJason Merrill <jason@gcc.gnu.org>2015-06-19 14:37:41 -0400
commit2ddf4350d319a1eb95075513b27dee09523e9a90 (patch)
tree7a2145ee447eb80e37fa6eb1419696168d76664a /gcc/cp
parent62245e6f7ed68c9c387418827612d719fdc63830 (diff)
downloadgcc-2ddf4350d319a1eb95075513b27dee09523e9a90.zip
gcc-2ddf4350d319a1eb95075513b27dee09523e9a90.tar.gz
gcc-2ddf4350d319a1eb95075513b27dee09523e9a90.tar.bz2
re PR c++/66585 (Internal compiler error when initialize field with lambda)
PR c++/66585 * pt.c (instantiate_class_template_1): Clear cp_unevaluated_operand and c_inhibit_evaluation_warnings. From-SVN: r224684
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/pt.c16
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7d42381..080d3e1 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/66585
+ * pt.c (instantiate_class_template_1): Clear
+ cp_unevaluated_operand and c_inhibit_evaluation_warnings.
+
2015-06-19 Jason Merrill <jason@redhat.com>
PR c++/65880
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 5dd5bfe..efb90e4 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -9215,12 +9215,20 @@ instantiate_class_template_1 (tree type)
it now. */
push_deferring_access_checks (dk_no_deferred);
+ int saved_unevaluated_operand = cp_unevaluated_operand;
+ int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
+
fn_context = decl_function_context (TYPE_MAIN_DECL (type));
/* Also avoid push_to_top_level for a lambda in an NSDMI. */
if (!fn_context && LAMBDA_TYPE_P (type) && TYPE_CLASS_SCOPE_P (type))
fn_context = error_mark_node;
if (!fn_context)
push_to_top_level ();
+ else
+ {
+ cp_unevaluated_operand = 0;
+ c_inhibit_evaluation_warnings = 0;
+ }
/* Use #pragma pack from the template context. */
saved_maximum_field_alignment = maximum_field_alignment;
maximum_field_alignment = TYPE_PRECISION (pattern);
@@ -9636,6 +9644,14 @@ instantiate_class_template_1 (tree type)
}
}
+ if (fn_context)
+ {
+ /* Restore these before substituting into the lambda capture
+ initializers. */
+ cp_unevaluated_operand = saved_unevaluated_operand;
+ c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
+ }
+
if (tree expr = CLASSTYPE_LAMBDA_EXPR (type))
{
tree decl = lambda_function (type);