diff --git a/Lib/swigwarnings.swg b/Lib/swigwarnings.swg index 3f9ddcb58..63ae4c65a 100644 --- a/Lib/swigwarnings.swg +++ b/Lib/swigwarnings.swg @@ -108,6 +108,7 @@ %define SWIGWARN_IGNORE_OPERATOR_NEWARR_MSG "394:operator new[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_DELARR_MSG "395:operator delete[] ignored" %enddef %define SWIGWARN_IGNORE_OPERATOR_REF_MSG "396:operator*() ignored" %enddef +%define SWIGWARN_IGNORE_OPERATOR_LTEQUALGT_MSG "397:operator<=> ignored" %enddef #define %ignoreoperator(Oper) %ignorewarn(SWIGWARN_IGNORE_OPERATOR_##Oper##_MSG) diff --git a/Source/CParse/cscanner.c b/Source/CParse/cscanner.c index 558a9c6cf..db0e6df27 100644 --- a/Source/CParse/cscanner.c +++ b/Source/CParse/cscanner.c @@ -331,6 +331,8 @@ static int yylook(void) { return COLON; case SWIG_TOKEN_DCOLONSTAR: return DSTAR; + case SWIG_TOKEN_LTEQUALGT: + return LESSEQUALGREATER; case SWIG_TOKEN_DCOLON: { diff --git a/Source/CParse/parser.y b/Source/CParse/parser.y index 1a5d4a201..e2d37dae0 100644 --- a/Source/CParse/parser.y +++ b/Source/CParse/parser.y @@ -1626,7 +1626,7 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier) %token TYPEMAP EXCEPT ECHO APPLY CLEAR SWIGTEMPLATE FRAGMENT %token WARN %token LESSTHAN GREATERTHAN DELETE_KW DEFAULT -%token LESSTHANOREQUALTO GREATERTHANOREQUALTO EQUALTO NOTEQUALTO +%token LESSTHANOREQUALTO GREATERTHANOREQUALTO EQUALTO NOTEQUALTO LESSEQUALGREATER %token ARROW %token QUESTIONMARK %token TYPES PARMS @@ -1647,7 +1647,7 @@ static String *add_qualifier_to_declarator(SwigType *type, SwigType *qualifier) %left XOR %left AND %left EQUALTO NOTEQUALTO -%left GREATERTHAN LESSTHAN GREATERTHANOREQUALTO LESSTHANOREQUALTO +%left GREATERTHAN LESSTHAN GREATERTHANOREQUALTO LESSTHANOREQUALTO LESSEQUALGREATER %left LSHIFT RSHIFT %left PLUS MINUS %left STAR SLASH MODULO @@ -6844,6 +6844,10 @@ exprcompound : expr PLUS expr { $$.val = NewStringf("%s <= %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); $$.type = cparse_cplusplus ? T_BOOL : T_INT; } + | expr LESSEQUALGREATER expr { + $$.val = NewStringf("%s <=> %s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3)); + $$.type = T_BOOL; + } | expr QUESTIONMARK expr COLON expr %prec QUESTIONMARK { $$.val = NewStringf("%s?%s:%s", COMPOUND_EXPR_VAL($1), COMPOUND_EXPR_VAL($3), COMPOUND_EXPR_VAL($5)); /* This may not be exactly right, but is probably good enough diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index f37cb0ef2..89df97a88 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -147,6 +147,7 @@ #define WARN_IGNORE_OPERATOR_NEWARR 394 /* new [] */ #define WARN_IGNORE_OPERATOR_DELARR 395 /* delete [] */ #define WARN_IGNORE_OPERATOR_REF 396 /* operator *() */ +#define WARN_IGNORE_OPERATOR_LTEQUALGT 397 /* <=> */ /* please leave 350-399 free for WARN_IGNORE_OPERATOR_* */ diff --git a/Source/Swig/scanner.c b/Source/Swig/scanner.c index b03a07a5b..961da8343 100644 --- a/Source/Swig/scanner.c +++ b/Source/Swig/scanner.c @@ -893,8 +893,18 @@ static int look(Scanner *s) { } if (c == '<') state = 240; - else if (c == '=') - return SWIG_TOKEN_LTEQUAL; + else if (c == '=') { + if ((c = nextchar(s)) == 0) { + brackets_increment(s); + return SWIG_TOKEN_LTEQUAL; + } else if (c == '>') { /* Spaceship operator */ + return SWIG_TOKEN_LTEQUALGT; + } else { + retract(s, 1); + brackets_increment(s); + return SWIG_TOKEN_LTEQUAL; + } + } else { retract(s, 1); brackets_increment(s); diff --git a/Source/Swig/swigscan.h b/Source/Swig/swigscan.h index 526413a14..0476e8587 100644 --- a/Source/Swig/swigscan.h +++ b/Source/Swig/swigscan.h @@ -116,3 +116,4 @@ extern void Scanner_locator(Scanner *, String *loc); #define SWIG_TOKEN_MODEQUAL 134 /* %= */ #define SWIG_TOKEN_ARROW 135 /* -> */ #define SWIG_TOKEN_ARROWSTAR 136 /* ->* */ +#define SWIG_TOKEN_LTEQUALGT 137 /* <=> */