Hi,
another - rather long standing - error-recovery regression, where, in
some rather special circumstances, we end up passing the FUNCTION_DECL
representing the operator () of the lambda to maybe_dummy_object and
obviously we almost immediately crash. Not sure how much we want to dig
- but simply checking that context_for_name_lookup is actually returning
a type appears to work fine, the error_mark_node then propagates back to
cp_parser_late_parse_one_default_arg and so on. In the special
circumstances of the testcase, context_for_name_lookup finds
ANON_AGGR_TYPE_P set for the DECL_CONTEXT of 'b' and iterates to its
TYPE_CONTEXT which is the FUNCTION_DECL representing the operator () of
the lambda. This is because we just called check_tag_decl on that
anonymous type as part of calling shadow_tag on the abstract
declaration. Tested x86_64-linux.
Thanks, Paolo.
////////////////////
/cp
2019-03-15 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/85014
* semantics.c (finish_non_static_data_member): Check return value
of context_for_name_lookup and immediately return error_mark_node
if isn't a type.
/testsuite
2019-03-15 Paolo Carlini <paolo.carl...@oracle.com>
PR c++/85014
* g++.dg/cpp0x/pr85014.C: New.
Index: cp/semantics.c
===================================================================
--- cp/semantics.c (revision 269693)
+++ cp/semantics.c (working copy)
@@ -1828,7 +1828,15 @@ finish_non_static_data_member (tree decl, tree obj
{
tree scope = qualifying_scope;
if (scope == NULL_TREE)
- scope = context_for_name_lookup (decl);
+ {
+ scope = context_for_name_lookup (decl);
+ if (!TYPE_P (scope))
+ {
+ /* Can happen during error recovery (c++/85014). */
+ gcc_assert (seen_error ());
+ return error_mark_node;
+ }
+ }
object = maybe_dummy_object (scope, NULL);
}
Index: testsuite/g++.dg/cpp0x/pr85014.C
===================================================================
--- testsuite/g++.dg/cpp0x/pr85014.C (nonexistent)
+++ testsuite/g++.dg/cpp0x/pr85014.C (working copy)
@@ -0,0 +1,10 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "" }
+
+struct {
+ short a[__builtin_constant_p([] {
+ struct {
+ int b = b;
+ }; // { dg-error "abstract declarator" }
+ })];
+}; // { dg-error "abstract declarator" }