mirror of git://gcc.gnu.org/git/gcc.git
re PR c++/53137 (g++ segfault)
PR c++/53137 * pt.c (instantiate_class_template_1): Set LAMBDA_EXPR_THIS_CAPTURE. (instantiate_decl): Don't push_to_top_level for local class methods. (instantiate_class_template_1): Or for local classes. From-SVN: r188117
This commit is contained in:
parent
d37c775a73
commit
3dfaf1d7db
|
@ -1,5 +1,10 @@
|
||||||
2012-06-01 Jason Merrill <jason@redhat.com>
|
2012-06-01 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/53137
|
||||||
|
* pt.c (instantiate_class_template_1): Set LAMBDA_EXPR_THIS_CAPTURE.
|
||||||
|
(instantiate_decl): Don't push_to_top_level for local class methods.
|
||||||
|
(instantiate_class_template_1): Or for local classes.
|
||||||
|
|
||||||
PR c++/53484
|
PR c++/53484
|
||||||
* pt.c (do_auto_deduction): Don't try to deduce from a
|
* pt.c (do_auto_deduction): Don't try to deduce from a
|
||||||
type-dependent initializer.
|
type-dependent initializer.
|
||||||
|
|
28
gcc/cp/pt.c
28
gcc/cp/pt.c
|
@ -8698,6 +8698,7 @@ instantiate_class_template_1 (tree type)
|
||||||
tree pbinfo;
|
tree pbinfo;
|
||||||
tree base_list;
|
tree base_list;
|
||||||
unsigned int saved_maximum_field_alignment;
|
unsigned int saved_maximum_field_alignment;
|
||||||
|
tree fn_context;
|
||||||
|
|
||||||
if (type == error_mark_node)
|
if (type == error_mark_node)
|
||||||
return error_mark_node;
|
return error_mark_node;
|
||||||
|
@ -8756,7 +8757,9 @@ instantiate_class_template_1 (tree type)
|
||||||
it now. */
|
it now. */
|
||||||
push_deferring_access_checks (dk_no_deferred);
|
push_deferring_access_checks (dk_no_deferred);
|
||||||
|
|
||||||
push_to_top_level ();
|
fn_context = decl_function_context (TYPE_MAIN_DECL (type));
|
||||||
|
if (!fn_context)
|
||||||
|
push_to_top_level ();
|
||||||
/* Use #pragma pack from the template context. */
|
/* Use #pragma pack from the template context. */
|
||||||
saved_maximum_field_alignment = maximum_field_alignment;
|
saved_maximum_field_alignment = maximum_field_alignment;
|
||||||
maximum_field_alignment = TYPE_PRECISION (pattern);
|
maximum_field_alignment = TYPE_PRECISION (pattern);
|
||||||
|
@ -9154,8 +9157,14 @@ instantiate_class_template_1 (tree type)
|
||||||
tree decl = lambda_function (type);
|
tree decl = lambda_function (type);
|
||||||
if (decl)
|
if (decl)
|
||||||
{
|
{
|
||||||
|
tree lam = CLASSTYPE_LAMBDA_EXPR (type);
|
||||||
|
LAMBDA_EXPR_THIS_CAPTURE (lam)
|
||||||
|
= lookup_field_1 (type, get_identifier ("__this"), false);
|
||||||
|
|
||||||
instantiate_decl (decl, false, false);
|
instantiate_decl (decl, false, false);
|
||||||
maybe_add_lambda_conv_op (type);
|
maybe_add_lambda_conv_op (type);
|
||||||
|
|
||||||
|
LAMBDA_EXPR_THIS_CAPTURE (lam) = NULL_TREE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
gcc_assert (errorcount);
|
gcc_assert (errorcount);
|
||||||
|
@ -9186,7 +9195,8 @@ instantiate_class_template_1 (tree type)
|
||||||
perform_deferred_access_checks ();
|
perform_deferred_access_checks ();
|
||||||
pop_nested_class ();
|
pop_nested_class ();
|
||||||
maximum_field_alignment = saved_maximum_field_alignment;
|
maximum_field_alignment = saved_maximum_field_alignment;
|
||||||
pop_from_top_level ();
|
if (!fn_context)
|
||||||
|
pop_from_top_level ();
|
||||||
pop_deferring_access_checks ();
|
pop_deferring_access_checks ();
|
||||||
pop_tinst_level ();
|
pop_tinst_level ();
|
||||||
|
|
||||||
|
@ -18435,9 +18445,10 @@ instantiate_decl (tree d, int defer_ok,
|
||||||
tree spec;
|
tree spec;
|
||||||
tree gen_tmpl;
|
tree gen_tmpl;
|
||||||
bool pattern_defined;
|
bool pattern_defined;
|
||||||
int need_push;
|
|
||||||
location_t saved_loc = input_location;
|
location_t saved_loc = input_location;
|
||||||
bool external_p;
|
bool external_p;
|
||||||
|
tree fn_context;
|
||||||
|
bool nested;
|
||||||
|
|
||||||
/* This function should only be used to instantiate templates for
|
/* This function should only be used to instantiate templates for
|
||||||
functions and static member variables. */
|
functions and static member variables. */
|
||||||
|
@ -18672,9 +18683,12 @@ instantiate_decl (tree d, int defer_ok,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
need_push = !cfun || !global_bindings_p ();
|
fn_context = decl_function_context (d);
|
||||||
if (need_push)
|
nested = (current_function_decl != NULL_TREE);
|
||||||
|
if (!fn_context)
|
||||||
push_to_top_level ();
|
push_to_top_level ();
|
||||||
|
else if (nested)
|
||||||
|
push_function_context ();
|
||||||
|
|
||||||
/* Mark D as instantiated so that recursive calls to
|
/* Mark D as instantiated so that recursive calls to
|
||||||
instantiate_decl do not try to instantiate it again. */
|
instantiate_decl do not try to instantiate it again. */
|
||||||
|
@ -18784,8 +18798,10 @@ instantiate_decl (tree d, int defer_ok,
|
||||||
/* We're not deferring instantiation any more. */
|
/* We're not deferring instantiation any more. */
|
||||||
TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0;
|
TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0;
|
||||||
|
|
||||||
if (need_push)
|
if (!fn_context)
|
||||||
pop_from_top_level ();
|
pop_from_top_level ();
|
||||||
|
else if (nested)
|
||||||
|
pop_function_context ();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
input_location = saved_loc;
|
input_location = saved_loc;
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
2012-06-01 Jason Merrill <jason@redhat.com>
|
2012-06-01 Jason Merrill <jason@redhat.com>
|
||||||
|
|
||||||
|
PR c++/53137
|
||||||
|
* g++.dg/cpp0x/lambda/lambda-template5.C: New.
|
||||||
|
|
||||||
PR c++/53484
|
PR c++/53484
|
||||||
* g++.dg/cpp0x/auto33.C: New.
|
* g++.dg/cpp0x/auto33.C: New.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
// PR c++/53137
|
||||||
|
// { dg-do compile { target c++11 } }
|
||||||
|
|
||||||
|
struct A
|
||||||
|
{
|
||||||
|
template <typename T> void f();
|
||||||
|
|
||||||
|
template <typename T> void g()
|
||||||
|
{
|
||||||
|
[this]{ f<T>(); }();
|
||||||
|
}
|
||||||
|
|
||||||
|
void h()
|
||||||
|
{
|
||||||
|
g<int>();
|
||||||
|
}
|
||||||
|
};
|
Loading…
Reference in New Issue