[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:
parent
34722c3669
commit
7c5b407fa2
@ -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
|
||||
|
@ -1623,6 +1623,9 @@ nested_anon_class_index (tree type)
|
||||
++index;
|
||||
}
|
||||
|
||||
if (seen_error ())
|
||||
return -1;
|
||||
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
17
gcc/testsuite/g++.dg/pr85039-1.C
Normal file
17
gcc/testsuite/g++.dg/pr85039-1.C
Normal 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);
|
||||
}
|
10
gcc/testsuite/g++.dg/pr85039-2.C
Normal file
10
gcc/testsuite/g++.dg/pr85039-2.C
Normal 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));
|
Loading…
x
Reference in New Issue
Block a user