@@ -29,6 +29,87 @@ static const char *fb_known_attribute_names[] = {
2929 "sorted" ,
3030};
3131
32+ static const char * fb_reserved_kw_enum_members [] = {
33+ "_const_ptr_add" ,
34+ "_ptr_add" ,
35+ "_size" ,
36+ "array_copy" ,
37+ "array_copy_from_pe" ,
38+ "array_copy_to_pe" ,
39+ "assign" ,
40+ "assign_from_pe" ,
41+ "assign_to_pe" ,
42+ "cast_from_be" ,
43+ "cast_from_le" ,
44+ "cast_from_pe" ,
45+ "cast_to_be" ,
46+ "cast_to_le" ,
47+ "cast_to_pe" ,
48+ "copy" ,
49+ "copy_from_pe" ,
50+ "copy_to_pe" ,
51+ "enum_t" ,
52+ "from_pe" ,
53+ "is_known_value" ,
54+ "name" ,
55+ "parse_json_enum" ,
56+ "print_json_enum" ,
57+ "read" ,
58+ "read_from_pe" ,
59+ "read_to_pe" ,
60+ "to_pe" ,
61+ // "vec_*",
62+ "write" ,
63+ "write_from_pe" ,
64+ "write_to_pe" ,
65+ };
66+
67+ static const char * fb_reserved_kw_table_fields [] = {
68+ "add_type" ,
69+ "add_value" ,
70+ "begin" ,
71+ "clone" ,
72+ "create" ,
73+ "end" ,
74+ "end_pe" ,
75+ "force_add" ,
76+ "table_t" ,
77+ "verity_table" ,
78+ };
79+
80+ static const char * fb_reserved_kw_table_field_prefixes [] = {
81+ "as_" ,
82+ "clone_as_" ,
83+ "create_as_" ,
84+ "end_as_" ,
85+ "parse_json_" ,
86+ "print_json_" ,
87+ "start_as_" ,
88+ // "vec_ ",
89+ "verify_as_*" ,
90+ };
91+
92+ static const char * fb_reserved_kw_table_field_suffixes [] = {
93+ "_add" ,
94+ "_clone" ,
95+ "_create" ,
96+ "_end" ,
97+ "_get" ,
98+ "_get_ptr" ,
99+ "_force_add" ,
100+ "_is_present" ,
101+ "_pick" ,
102+ "_push_start" ,
103+ "_push_end" ,
104+ "_push_create" ,
105+ "_start" ,
106+ };
107+
108+ /* For table and enum members. */
109+ static const char * fb_reserved_kw_vec_prefixes [] = {
110+ "vec_" ,
111+ };
112+
32113static const int fb_known_attribute_types [] = {
33114 vt_invalid , /* Unknowns have arbitrary types. */
34115 vt_uint ,
@@ -396,6 +477,110 @@ static void install_known_attributes(fb_parser_t *P)
396477 }
397478}
398479
480+ static void install_reserved_keyword_table (fb_parser_t * P , const char * table [], size_t count , int kind )
481+ {
482+ fb_reserved_kw_t * kw ;
483+ size_t i ;
484+
485+ for (i = 0 ; i < count ; ++ i ) {
486+ kw = new_elem (P , sizeof (* kw ));
487+ kw -> name .name .s .s = (char * )table [i ];
488+ kw -> name .name .s .len = (int )strlen (table [i ]);
489+ kw -> name .link = 0 ;
490+ kw -> kind = kind ;
491+ define_fb_name (& P -> schema .root_schema -> keyword_index , & kw -> name );
492+ }
493+ }
494+
495+ #define KW_TABLE_LEN (T ) (sizeof(T)/sizeof(T[0]))
496+
497+ static void install_reserved_keywords (fb_parser_t * P )
498+ {
499+ install_reserved_keyword_table (P , fb_reserved_kw_enum_members ,
500+ KW_TABLE_LEN (fb_reserved_kw_enum_members ),
501+ fb_reserved_kw_kind_enum_member );
502+ install_reserved_keyword_table (P , fb_reserved_kw_table_fields ,
503+ KW_TABLE_LEN (fb_reserved_kw_table_fields ),
504+ fb_reserved_kw_kind_table_field );
505+ install_reserved_keyword_table (P , fb_reserved_kw_table_field_prefixes ,
506+ KW_TABLE_LEN (fb_reserved_kw_table_field_prefixes ),
507+ fb_reserved_kw_kind_table_field_prefix );
508+ install_reserved_keyword_table (P , fb_reserved_kw_table_field_suffixes ,
509+ KW_TABLE_LEN (fb_reserved_kw_table_field_suffixes ),
510+ fb_reserved_kw_kind_table_field_suffix );
511+ install_reserved_keyword_table (P , fb_reserved_kw_vec_prefixes ,
512+ KW_TABLE_LEN (fb_reserved_kw_vec_prefixes ),
513+ fb_reserved_kw_kind_vec_prefix );
514+ }
515+
516+ static void check_reserved_enum_member (fb_parser_t * P , fb_symbol_t * sym )
517+ {
518+ const char * text = sym -> ident -> text ;
519+ size_t len = (size_t )sym -> ident -> len ;
520+ fb_reserved_kw_t * kw = 0 ;
521+ size_t i ;
522+
523+ kw = (fb_reserved_kw_t * )fb_name_table_find (& P -> schema .root_schema -> keyword_index ,
524+ text , len );
525+ if (kw && kw -> kind == fb_reserved_kw_kind_enum_member ) {
526+ warn_tok (P , sym -> ident , "potential enum member name conflict in C source" );
527+ warn_tok_as_string (P , sym -> ident , "name is reserved" , kw -> name .name .s .s , (size_t )kw -> name .name .s .len );
528+ return ;
529+ }
530+ for (i = 0 ; i < len ; ++ i ) {
531+ if (text [i ] == '_' ) {
532+ if (i + 1 < len ) {
533+ kw = (fb_reserved_kw_t * )fb_name_table_find (& P -> schema .root_schema -> keyword_index ,
534+ text , i + 1 );
535+ if (kw && (kw -> kind == fb_reserved_kw_kind_vec_prefix )) {
536+ warn_tok (P , sym -> ident , "potential enum member name conflict in C source" );
537+ warn_tok_as_string (P , sym -> ident , "prefix is reserved" , kw -> name .name .s .s , (size_t )kw -> name .name .s .len );
538+ return ;
539+ }
540+ }
541+ }
542+ }
543+ }
544+
545+ static void check_reserved_table_field (fb_parser_t * P , fb_symbol_t * sym )
546+ {
547+ const char * text = sym -> ident -> text ;
548+ size_t len = (size_t )sym -> ident -> len ;
549+ fb_reserved_kw_t * kw = 0 ;
550+ size_t i ;
551+
552+ kw = (fb_reserved_kw_t * )fb_name_table_find (& P -> schema .root_schema -> keyword_index ,
553+ text , len );
554+ if (kw && kw -> kind == fb_reserved_kw_kind_table_field ) {
555+ warn_tok (P , sym -> ident , "potential table field conflict in C source (option -g might help)" );
556+ warn_tok_as_string (P , sym -> ident , "name is reserved" , kw -> name .name .s .s , (size_t )kw -> name .name .s .len );
557+ return ;
558+ }
559+ for (i = 0 ; i < len ; ++ i ) {
560+ if (text [i ] == '_' ) {
561+ if (i + 1 < len ) {
562+ kw = (fb_reserved_kw_t * )fb_name_table_find (& P -> schema .root_schema -> keyword_index ,
563+ text , i + 1 );
564+ if (kw && (kw -> kind == fb_reserved_kw_kind_table_field_prefix
565+ || kw -> kind == fb_reserved_kw_kind_vec_prefix )) {
566+ warn_tok (P , sym -> ident , "potential table field conflict in C source (option -g might help)" );
567+ warn_tok_as_string (P , sym -> ident , "prefix is reserved" , kw -> name .name .s .s , (size_t )kw -> name .name .s .len );
568+ return ;
569+ }
570+ }
571+ if (i > 0 ) {
572+ kw = (fb_reserved_kw_t * )fb_name_table_find (& P -> schema .root_schema -> keyword_index ,
573+ text + i , len - i );
574+ if (kw && kw -> kind == fb_reserved_kw_kind_table_field_suffix ) {
575+ warn_tok (P , sym -> ident , "potential table field conflict in C source (option -g might help)" );
576+ warn_tok_as_string (P , sym -> ident , "suffix is reserved" , kw -> name .name .s .s , (size_t )kw -> name .name .s .len );
577+ return ;
578+ }
579+ }
580+ }
581+ }
582+ }
583+
399584static void revert_order (fb_compound_type_t * * list ) {
400585 fb_compound_type_t * next , * prev = 0 , * link = * list ;
401586
@@ -948,6 +1133,7 @@ static int process_table(fb_parser_t *P, fb_compound_type_t *ct)
9481133 error_sym (P , sym , "internal error: member type expected" );
9491134 return -1 ;
9501135 }
1136+ check_reserved_table_field (P , sym );
9511137 member = (fb_member_t * )sym ;
9521138 if (member -> type .type == vt_invalid ) {
9531139 continue ;
@@ -1619,6 +1805,9 @@ static int process_enum(fb_parser_t *P, fb_compound_type_t *ct)
16191805
16201806 for (sym = ct -> members ; sym ; sym = sym -> link , first = 0 ) {
16211807 member = (fb_member_t * )sym ;
1808+ if (!is_union ) {
1809+ check_reserved_enum_member (P , sym );
1810+ }
16221811 if ((old = define_fb_symbol (& ct -> index , sym ))) {
16231812 if (old -> ident == & P -> t_none ) {
16241813 /*
@@ -1822,6 +2011,7 @@ int fb_build_schema(fb_parser_t *P)
18222011 }
18232012 }
18242013 install_known_attributes (P );
2014+ install_reserved_keywords (P );
18252015
18262016 if (!P -> opts .hide_later_enum ) {
18272017 for (sym = S -> symbols ; sym ; sym = sym -> link ) {
0 commit comments