re PR c++/58761 (ICE with a lambda capturing this in a NSDMI)

PR c++/58761
	* pt.c (tsubst_copy): Don't check at_function_scope_p.
	(instantiate_class_template_1): Don't push_to_top_level in an nsdmi.

From-SVN: r210624
This commit is contained in:
Jason Merrill 2014-05-19 14:41:24 -04:00 committed by Jason Merrill
parent 7fb80849cb
commit 0f5b01358d
3 changed files with 33 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2014-05-19 Jason Merrill <jason@redhat.com>
PR c++/58761
* pt.c (tsubst_copy): Don't check at_function_scope_p.
(instantiate_class_template_1): Don't push_to_top_level in an nsdmi.
2014-05-19 Paolo Carlini <paolo.carlini@oracle.com>
* typeck2.c (cxx_incomplete_type_diagnostic): Use inform.

View file

@ -8942,6 +8942,9 @@ instantiate_class_template_1 (tree type)
push_deferring_access_checks (dk_no_deferred);
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 ();
/* Use #pragma pack from the template context. */
@ -12531,7 +12534,7 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl)
{
/* We get here for a use of 'this' in an NSDMI. */
if (DECL_NAME (t) == this_identifier
&& at_function_scope_p ()
&& current_function_decl
&& DECL_CONSTRUCTOR_P (current_function_decl))
return current_class_ptr;

View file

@ -0,0 +1,23 @@
// PR c++/58761
// { dg-do compile { target c++11 } }
template <class T>
struct X
{
int x = 42;
int y = [this](){return this->x;}();
};
template <class T>
struct Y
{
int x = 42;
int y = [this](){return this->x;}();
Y(int) {}
};
int main()
{
X<int> x;
Y<int> y(42);
}