diff --git a/Examples/test-suite/cpp11_attribute_specifiers.i b/Examples/test-suite/cpp11_attribute_specifiers.i index 0d49b8615..063e431e0 100644 --- a/Examples/test-suite/cpp11_attribute_specifiers.i +++ b/Examples/test-suite/cpp11_attribute_specifiers.i @@ -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 + %} diff --git a/Source/CParse/cscanner.c b/Source/CParse/cscanner.c index 75f100d1c..558a9c6cf 100644 --- a/Source/CParse/cscanner.c +++ b/Source/CParse/cscanner.c @@ -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 */ diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 010df3c1c..ddb9634b2 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -1613,7 +1613,6 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier) %token 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