From: jason Date: Fri, 1 Jun 2012 18:43:34 +0000 (+0000) Subject: PR c++/53137 X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=65bb4d09fa9c74b2f077667d7d77526217a52b14 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@188123 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index aa724e977a1..2bdff6188b7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2012-06-01 Jason Merrill + 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 * pt.c (do_auto_deduction): Don't try to deduce from a type-dependent initializer. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e4631e7ae0d..a2d8374ea50 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8734,6 +8734,7 @@ instantiate_class_template_1 (tree type) tree pbinfo; tree base_list; unsigned int saved_maximum_field_alignment; + tree fn_context; if (type == error_mark_node) return error_mark_node; @@ -8792,7 +8793,9 @@ instantiate_class_template_1 (tree type) it now. */ 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. */ saved_maximum_field_alignment = maximum_field_alignment; maximum_field_alignment = TYPE_PRECISION (pattern); @@ -9191,8 +9194,14 @@ instantiate_class_template_1 (tree type) apply_lambda_return_type (lambda, void_type_node); LAMBDA_EXPR_RETURN_TYPE (lambda) = NULL_TREE; } + + LAMBDA_EXPR_THIS_CAPTURE (lambda) + = lookup_field_1 (type, get_identifier ("__this"), false); + instantiate_decl (decl, false, false); maybe_add_lambda_conv_op (type); + + LAMBDA_EXPR_THIS_CAPTURE (lambda) = NULL_TREE; } else gcc_assert (errorcount); @@ -9223,7 +9232,8 @@ instantiate_class_template_1 (tree type) perform_deferred_access_checks (); pop_nested_class (); maximum_field_alignment = saved_maximum_field_alignment; - pop_from_top_level (); + if (!fn_context) + pop_from_top_level (); pop_deferring_access_checks (); pop_tinst_level (); @@ -18456,9 +18466,10 @@ instantiate_decl (tree d, int defer_ok, tree spec; tree gen_tmpl; bool pattern_defined; - int need_push; location_t saved_loc = input_location; bool external_p; + tree fn_context; + bool nested; /* This function should only be used to instantiate templates for functions and static member variables. */ @@ -18693,9 +18704,12 @@ instantiate_decl (tree d, int defer_ok, goto out; } - need_push = !cfun || !global_bindings_p (); - if (need_push) + fn_context = decl_function_context (d); + nested = (current_function_decl != NULL_TREE); + if (!fn_context) push_to_top_level (); + else if (nested) + push_function_context (); /* Mark D as instantiated so that recursive calls to instantiate_decl do not try to instantiate it again. */ @@ -18808,8 +18822,10 @@ instantiate_decl (tree d, int defer_ok, /* We're not deferring instantiation any more. */ TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0; - if (need_push) + if (!fn_context) pop_from_top_level (); + else if (nested) + pop_function_context (); out: input_location = saved_loc; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7aba69ef8a6..b64a74bafe6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2012-06-01 Jason Merrill + PR c++/53137 + * g++.dg/cpp0x/lambda/lambda-template5.C: New. + +2012-06-01 Jason Merrill + PR c++/53484 * g++.dg/cpp0x/auto33.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C new file mode 100644 index 00000000000..b91b89ff36c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-template5.C @@ -0,0 +1,17 @@ +// PR c++/53137 +// { dg-do compile { target c++11 } } + +struct A +{ + template void f(); + + template void g() + { + [this]{ f(); }(); + } + + void h() + { + g(); + } +};