Turn an unmatched ]] back into two ]

Needed to handle e.g. `a[a[0]]`.  SWIG's parser doesn't seem to handle
that currently though.  See #2286.
This commit is contained in:
Olly Betts 2022-07-08 15:50:51 +12:00
commit 04abbcf4ae
3 changed files with 10 additions and 2 deletions

View file

@ -40,4 +40,11 @@ struct [[nodiscard]] S { };
const char *test_string_literal() { return "Test [[ and ]] in string literal"; }
#if 0
// Check that SWIG doesn't choke on ]] when it's not part of an attribute.
// FIXME: SWIG's parser doesn't handle this case currently.
int *a;
int b = a[a[0]];
#endif
%}

View file

@ -364,7 +364,9 @@ static int yylook(void) {
break;
case SWIG_TOKEN_RRBRACKET:
return RRBRACKET;
/* Turn an unmatched ]] back into two ] - e.g. `a[a[0]]` */
scanner_next_token(RBRACKET);
return RBRACKET;
/* Look for multi-character sequences */

View file

@ -1613,7 +1613,6 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier)
%token <type> TYPE_INT TYPE_UNSIGNED TYPE_SHORT TYPE_LONG TYPE_FLOAT TYPE_DOUBLE TYPE_CHAR TYPE_WCHAR TYPE_VOID TYPE_SIGNED TYPE_BOOL TYPE_COMPLEX TYPE_TYPEDEF TYPE_RAW TYPE_NON_ISO_INT8 TYPE_NON_ISO_INT16 TYPE_NON_ISO_INT32 TYPE_NON_ISO_INT64
%token LPAREN RPAREN COMMA SEMI EXTERN INIT LBRACE RBRACE PERIOD ELLIPSIS
%token CONST_QUAL VOLATILE REGISTER STRUCT UNION EQUAL SIZEOF MODULE LBRACKET RBRACKET
%token LLBRACKET RRBRACKET /* C++11 Attribute specifier sequence */
%token BEGINFILE ENDOFFILE
%token ILLEGAL CONSTANT
%token NAME RENAME NAMEWARN EXTEND PRAGMA FEATURE VARARGS