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));

Reply via email to