Hi,
this regression is about literal_type_p ICEing for types which cannot be
completed. Indeed, for the testcase, complete_type cannot complete the
type but doesn't error out either, just returns the type as-is, and the
gcc_assert triggers. We could imagine handling such types in the caller
- check_field_decls - but in my opinion makes more sense to just allow
such types and return false. I also considered changing literal_type_p
to use complete_type_or_else but then it's easy to produce duplicate
diagnostics, for example. What do you think?
Tested x86_64-linux.
Thanks,
Paolo.
PS: eventually I guess we want to fix this in mainline and 4.7.1.
///////////////////////////
/cp
2012-03-20 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/52487
* semantics.c (literal_type_p): Simply return false for types
which cannot be completed.
/testsuite
2012-03-20 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/52487
* g++.dg/cpp0x/lambda/lambda-ice7.C: New.
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));