From 41d04a8dfe0313dd2a4e2501d9ab6d1f06378dbf Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 11 Jan 2011 06:29:58 -0500 Subject: [PATCH] re PR c++/45520 ([C++0x] compiler segmentation fault on decltype in lambda-declarator) PR c++/45520 * tree.c (maybe_dummy_object): Check current_class_ref against context, not current_class_type. From-SVN: r168654 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/tree.c | 12 ++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C | 14 ++++++++++++++ 4 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4cfe3e613b2..be7497a8520 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2011-01-11 Jason Merrill + + PR c++/45520 + * tree.c (maybe_dummy_object): Check current_class_ref against + context, not current_class_type. + 2011-01-08 Nicola Pero PR objc/47078 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index dcce44a439f..213279ac0a9 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2374,12 +2374,12 @@ maybe_dummy_object (tree type, tree* binfop) if (binfop) *binfop = binfo; - if (current_class_ref && context == current_class_type - /* Kludge: Make sure that current_class_type is actually - correct. It might not be if we're in the middle of - tsubst_default_argument. */ - && same_type_p (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref)), - current_class_type)) + if (current_class_ref + /* current_class_ref might not correspond to current_class_type if + we're in tsubst_default_argument or a lambda-declarator; in either + case, we want to use current_class_ref if it matches CONTEXT. */ + && (same_type_ignoring_top_level_qualifiers_p + (TREE_TYPE (current_class_ref), context))) decl = current_class_ref; else if (current != current_class_type && context == nonlambda_method_basetype ()) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 22041467a2f..999a713353c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-11 Jason Merrill + + PR c++/45520 + * g++.dg/cpp0x/lambda/lambda-this3.C: New. + 2011-01-11 Iain Sandoe * objc-obj-c++-shared/next-mapping.h: Add copyright header. diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C new file mode 100644 index 00000000000..de0d357f3ff --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-this3.C @@ -0,0 +1,14 @@ +// PR c++/45520 +// { dg-options -std=c++0x } + +struct M { + int i; +}; + +struct S { + M m; + + void f() { + auto lambda=[&](decltype(m.i) & i) { }; + } +}; -- 2.30.2