@@ -629,7 +629,7 @@ static get_char_t skip_macros(parser_t *p)
629
629
return PARSER_EOF ;
630
630
}
631
631
632
- static get_char_t skip_inline_asm (parser_t * p )
632
+ static get_char_t skip_inline_asm (parser_t * p , bool underscore )
633
633
{
634
634
get_char_t ch = get_char (p );
635
635
if (ch != 's' )
@@ -642,6 +642,19 @@ static get_char_t skip_inline_asm(parser_t *p)
642
642
if (UNLIKELY (ch == PARSER_EOF ))
643
643
return ch ;
644
644
645
+ if (underscore ) {
646
+ ch = get_char (p );
647
+ if (ch != '_' )
648
+ goto check_underline_1_failed ;
649
+ if (UNLIKELY (ch == PARSER_EOF ))
650
+ return ch ;
651
+ ch = get_char (p );
652
+ if (ch != '_' )
653
+ goto check_underline_2_failed ;
654
+ if (UNLIKELY (ch == PARSER_EOF ))
655
+ return ch ;
656
+ }
657
+
645
658
int paren = 0 ;
646
659
do {
647
660
ch = get_char (p );
@@ -665,6 +678,10 @@ static get_char_t skip_inline_asm(parser_t *p)
665
678
} while (paren );
666
679
return PARSER_COMMENT_FOUND ;
667
680
681
+ check_underline_2_failed :
682
+ unget_char (p );
683
+ check_underline_1_failed :
684
+ unget_char (p );
668
685
check_m_failed :
669
686
unget_char (p );
670
687
check_s_failed :
@@ -791,7 +808,31 @@ static get_char_t parse_inline_asm(parser_t *restrict p,
791
808
token_t * restrict t ,
792
809
get_char_t ch )
793
810
{
794
- get_char_t ret = skip_inline_asm (p );
811
+ get_char_t ret = skip_inline_asm (p , false);
812
+
813
+ if (ret == PARSER_COMMENT_FOUND ) {
814
+ ret |= PARSER_CONTINUE ;
815
+ return ret ;
816
+ }
817
+ if (UNLIKELY (ret == PARSER_EOF ))
818
+ return ret ;
819
+
820
+ return parse_identifier (p , t , ch );
821
+ }
822
+
823
+ /* Parse an potential inline assembly wraped with double underscores. */
824
+ static get_char_t parse_inline_asm_underscore (parser_t * restrict p ,
825
+ token_t * restrict t ,
826
+ get_char_t ch )
827
+ {
828
+ get_char_t ret = get_char (p );
829
+ if (ret != '_' ) {
830
+ unget_char (p );
831
+ return parse_identifier (p , t , ch );
832
+ }
833
+ if (UNLIKELY (ret == PARSER_EOF ))
834
+ return ret ;
835
+ ret = skip_inline_asm (p , true);
795
836
796
837
if (ret == PARSER_COMMENT_FOUND ) {
797
838
ret |= PARSER_CONTINUE ;
@@ -1224,7 +1265,7 @@ static get_token_action_t get_token_actions[] = {
1224
1265
['X' ] = parse_identifier ,
1225
1266
['Y' ] = parse_identifier ,
1226
1267
['Z' ] = parse_identifier ,
1227
- ['_' ] = parse_identifier ,
1268
+ ['_' ] = parse_inline_asm_underscore ,
1228
1269
['"' ] = parse_literal_string ,
1229
1270
['\'' ] = parse_literal_char ,
1230
1271
['\\' ] = parse_backslash ,
0 commit comments