re PR c++/58083 (ICE with lambda as default parameter of a template function)

PR c++/58083
	* name-lookup.c (push_class_level_binding_1): It's OK to push a
	lambda type after the enclosing type is complete.

From-SVN: r201822
This commit is contained in:
Jason Merrill 2013-08-17 21:06:49 -04:00 committed by Jason Merrill
parent d709431600
commit 34fdd6b31e
3 changed files with 40 additions and 2 deletions

View file

@ -1,3 +1,9 @@
2013-08-17 Jason Merrill <jason@redhat.com>
PR c++/58083
* name-lookup.c (push_class_level_binding_1): It's OK to push a
lambda type after the enclosing type is complete.
2013-08-17 Gabriel Dos Reis <gdr@integrable-solutions.net>
* error.c (dump_scope): Add a cxx_pretty_printer parameter.

View file

@ -3062,8 +3062,10 @@ push_class_level_binding_1 (tree name, tree x)
if (name == error_mark_node)
return false;
/* Check for invalid member names. */
gcc_assert (TYPE_BEING_DEFINED (current_class_type));
/* Check for invalid member names. But don't worry about a default
argument-scope lambda being pushed after the class is complete. */
gcc_assert (TYPE_BEING_DEFINED (current_class_type)
|| LAMBDA_TYPE_P (TREE_TYPE (decl)));
/* Check that we're pushing into the right binding level. */
gcc_assert (current_class_type == class_binding_level->this_entity);

View file

@ -0,0 +1,30 @@
// PR c++/58083
// { dg-do compile { target c++11 } }
namespace details {
struct iterator_concept_checker
{
typedef char yes_type;
typedef char (&no_type)[2];
template <typename T>
static no_type test(...);
template <typename T>
static yes_type test(
int*
, void (*)(T) = [](T it)
{
auto copy = T{it}; // copy constructible
copy = it; // copy assignable
copy.~T(); // destroyable
++it; // incrementable
}
);
};
}
int main()
{
details::iterator_concept_checker::test<int>(0);
}