mirror of
https://github.com/frida/tinycc
synced 2024-12-24 05:56:49 +03:00
fix the bug #31403: parser bug in structure
- a warning: unnamed struct/union that defines no instances - allow a nested named struct declaration w/o identifier only when option -fms-extensions is used
This commit is contained in:
parent
9fc3d66f1b
commit
dec959358a
1
libtcc.c
1
libtcc.c
@ -1463,6 +1463,7 @@ static const FlagDef flag_defs[] = {
|
||||
{ offsetof(TCCState, char_is_unsigned), FD_INVERT, "signed-char" },
|
||||
{ offsetof(TCCState, nocommon), FD_INVERT, "common" },
|
||||
{ offsetof(TCCState, leading_underscore), 0, "leading-underscore" },
|
||||
{ offsetof(TCCState, ms_extensions), 0, "ms-extensions" },
|
||||
};
|
||||
|
||||
/* set/reset a flag */
|
||||
|
@ -236,6 +236,11 @@ Do not generate common symbols for uninitialized data.
|
||||
@item -fleading-underscore
|
||||
Add a leading underscore at the beginning of each C symbol.
|
||||
|
||||
@item -fms-extensions
|
||||
Allow a MS C compiler extensions to the language. Curretly this
|
||||
assume a nested named structure declaration without identifier behave
|
||||
like an unnamed one.
|
||||
|
||||
@end table
|
||||
|
||||
Warning options:
|
||||
|
1
tcc.h
1
tcc.h
@ -602,6 +602,7 @@ struct TCCState {
|
||||
/* C language options */
|
||||
int char_is_unsigned;
|
||||
int leading_underscore;
|
||||
int ms_extensions; /* allow nested named struct w/o identifier behave like unnamed */
|
||||
|
||||
/* warning switches */
|
||||
int warn_write_strings;
|
||||
|
19
tccgen.c
19
tccgen.c
@ -2959,8 +2959,17 @@ static void struct_decl(CType *type, int u, int tdef)
|
||||
type1 = btype;
|
||||
if (tok != ':') {
|
||||
type_decl(&type1, &ad, &v, TYPE_DIRECT | TYPE_ABSTRACT);
|
||||
if (v == 0 && (type1.t & VT_BTYPE) != VT_STRUCT)
|
||||
expect("identifier");
|
||||
if (v == 0) {
|
||||
if ((type1.t & VT_BTYPE) != VT_STRUCT)
|
||||
expect("identifier");
|
||||
else {
|
||||
int v = btype.ref->v;
|
||||
if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) < SYM_FIRST_ANOM) {
|
||||
if (tcc_state->ms_extensions == 0)
|
||||
expect("identifier");
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type_size(&type1, &align) < 0) {
|
||||
if ((a == TOK_STRUCT) && (type1.t & VT_ARRAY) && c)
|
||||
flexible = 1;
|
||||
@ -6121,7 +6130,11 @@ static int decl0(int l, int is_for_loop_init)
|
||||
if (((btype.t & VT_BTYPE) == VT_ENUM ||
|
||||
(btype.t & VT_BTYPE) == VT_STRUCT) &&
|
||||
tok == ';') {
|
||||
/* we accept no variable after */
|
||||
if ((btype.t & VT_BTYPE) == VT_STRUCT) {
|
||||
int v = btype.ref->v;
|
||||
if (!(v & SYM_FIELD) && (v & ~SYM_STRUCT) >= SYM_FIRST_ANOM)
|
||||
tcc_warning("unnamed struct/union that defines no instances");
|
||||
}
|
||||
next();
|
||||
continue;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user