Message ID | 4F689E3A.20805@oracle.com |
---|---|
State | New |
Headers | show |
That assert is there to make sure that we don't try to test for literality of an incomplete type. We should check for completeness before trying to check for literality. Jason
On 03/20/2012 08:22 PM, Jason Merrill wrote: > That assert is there to make sure that we don't try to test for > literality of an incomplete type. We should check for completeness > before trying to check for literality. You mean, in the relevant caller, here in check_field_decls: /* If at least one non-static data member is non-literal, the whole class becomes non-literal. */ if (!literal_type_p (type)) CLASSTYPE_LITERAL_P (t) = false; essentially setting CLASSTYPE_LITERAL_P (t) = false; also when CLASS_TYPE_P (type) && !COMPLETE_TYPE_P (complete_type (type) or maybe just CLASS_TYPE_P (type) && !COMPLETE_TYPE_P (type) ? Thanks, Paolo.
Index: testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C =================================================================== --- testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C (revision 0) +++ testsuite/g++.dg/cpp0x/lambda/lambda-ice7.C (revision 0) @@ -0,0 +1,9 @@ +// PR c++/52487 +// { dg-options "-std=c++0x" } + +struct A; // { dg-error "forward declaration" } + +void foo(A& a) +{ + [=](){a;}; // { dg-error "invalid use of incomplete type" } +} Index: cp/semantics.c =================================================================== --- cp/semantics.c (revision 185571) +++ cp/semantics.c (working copy) @@ -5610,8 +5610,7 @@ literal_type_p (tree t) if (CLASS_TYPE_P (t)) { t = complete_type (t); - gcc_assert (COMPLETE_TYPE_P (t) || errorcount); - return CLASSTYPE_LITERAL_P (t); + return COMPLETE_TYPE_P (t) && CLASSTYPE_LITERAL_P (t); } if (TREE_CODE (t) == ARRAY_TYPE) return literal_type_p (strip_array_types (t));