[PR c++/85039] no type definitions in builtin offsetof

Types defined within a __builtin_offsetof argument don't always get
properly recorded as members of their context types, so if they're
anonymous, we may fail to assign them an anon type index for mangling
and ICE.

We shouldn't allow types to be introduced in __builtin_offsetof, I
think, and Jason says the std committee agrees, so I've arranged for
us to reject them.

Even then, we still parse the definitions and attempt to assign
mangled names to its member functions, so the ICE remains.  Since
we've already reported an error, we might as well complete the name
assignment with an arbitrary index, thus avoiding the ICE.

We used to have a test that expected to be able to define types in
__builtin_offsetof; this patch removes that specific test.


for  gcc/cp/ChangeLog

	PR c++/85039
	* parser.c (cp_parser_builtin_offset): Reject type definitions.
	* mangle.c (nested_anon_class_index): Avoid crash returning -1
	if we've seen errors.

for  gcc/testsuite/ChangeLog

	PR c++/85039
	* g++.dg/pr85039-1.C: New.
	* g++.dg/pr85039-2.C: New.
	* g++.dg/parse/semicolon3.C: Remove test_offsetof.

From-SVN: r259423
This commit is contained in:
Alexandre Oliva 2018-04-16 21:35:34 +00:00 committed by Alexandre Oliva
parent 34722c3669
commit 7c5b407fa2
7 changed files with 51 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2018-04-16 Alexandre Oliva <aoliva@redhat.com>
PR c++/85039
* parser.c (cp_parser_builtin_offset): Reject type definitions.
* mangle.c (nested_anon_class_index): Avoid crash returning -1
if we've seen errors.
2018-04-12 David Malcolm <dmalcolm@redhat.com>
PR c++/85385

View File

@ -1623,6 +1623,9 @@ nested_anon_class_index (tree type)
++index;
}
if (seen_error ())
return -1;
gcc_unreachable ();
}

View File

@ -9823,7 +9823,13 @@ cp_parser_builtin_offsetof (cp_parser *parser)
parens.require_open (parser);
/* Parse the type-id. */
location_t loc = cp_lexer_peek_token (parser->lexer)->location;
type = cp_parser_type_id (parser);
{
const char *saved_message = parser->type_definition_forbidden_message;
parser->type_definition_forbidden_message
= G_("types may not be defined within __builtin_offsetof");
type = cp_parser_type_id (parser);
parser->type_definition_forbidden_message = saved_message;
}
/* Look for the `,'. */
cp_parser_require (parser, CPP_COMMA, RT_COMMA);
token = cp_lexer_peek_token (parser->lexer);

View File

@ -1,3 +1,10 @@
2018-04-16 Alexandre Oliva <aoliva@redhat.com>
PR c++/85039
* g++.dg/pr85039-1.C: New.
* g++.dg/pr85039-2.C: New.
* g++.dg/parse/semicolon3.C: Remove test_offsetof.
2018-04-16 Bill Schmidt <wschmidt@linux.ibm.com>
PR target/85080

View File

@ -20,13 +20,6 @@ struct OK3
} // no complaints
(s7);
__SIZE_TYPE__
test_offsetof (void)
{
// no complaints about a missing semicolon
return __builtin_offsetof (struct OK4 { int a; int b; }, b);
}
struct OK5
{
int a;

View File

@ -0,0 +1,17 @@
// { dg-do compile { target c++14 } }
constexpr int a() {
return
__builtin_offsetof(struct { // { dg-error "types may not be defined" }
int i;
short b {
__builtin_offsetof(struct { // { dg-error "types may not be defined" }
int j;
struct c { // { dg-error "types may not be defined" }
void d() {
}
};
}, j)
};
}, i);
}

View File

@ -0,0 +1,10 @@
// { dg-do compile }
struct d {
static d *b;
} * d::b(__builtin_offsetof(struct { // { dg-error "types may not be defined" }
int i;
struct a { // { dg-error "types may not be defined" }
int c() { return .1f; }
};
}, i));