diff options
author | David Schulz <david.schulz@qt.io> | 2022-10-20 13:43:10 +0200 |
---|---|---|
committer | David Schulz <david.schulz@qt.io> | 2023-01-30 05:47:41 +0000 |
commit | 4e8b7eee9ddf2feb8f7ced24bb9425539059e698 (patch) | |
tree | fc78b4bb4ebbe8e2cb3968ecc4b8ee664401ad7c /src/libs/3rdparty/cplusplus | |
parent | c780151aece1ca31dfe4a283058295469832d56a (diff) |
Cpp: support space ship operator in lexer
Fixes: QTCREATORBUG-27503
Change-Id: Idbff5a9b5b2e6e841e298ca6f706ef3c6aa1622b
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 4 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Lexer.cpp | 7 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Names.h | 5 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Parser.cpp | 39 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Token.cpp | 1 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Token.h | 2 |
6 files changed, 37 insertions, 21 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index effaac4b65..7f10c79428 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -915,6 +915,10 @@ OperatorNameId::Kind Bind::cppOperator(OperatorAST *ast) kind = OperatorNameId::ArrayAccessOp; break; + case T_LESS_EQUAL_GREATER: + kind = OperatorNameId::SpaceShipOp; + break; + default: kind = OperatorNameId::InvalidOp; } // switch diff --git a/src/libs/3rdparty/cplusplus/Lexer.cpp b/src/libs/3rdparty/cplusplus/Lexer.cpp index 8e1f7e2899..e2f1b4e0e6 100644 --- a/src/libs/3rdparty/cplusplus/Lexer.cpp +++ b/src/libs/3rdparty/cplusplus/Lexer.cpp @@ -612,7 +612,12 @@ void Lexer::scan_helper(Token *tok) tok->f.kind = T_LESS_LESS; } else if (_yychar == '=') { yyinp(); - tok->f.kind = T_LESS_EQUAL; + if (_languageFeatures.cxx20Enabled && _yychar == '>') { + yyinp(); + tok->f.kind = T_LESS_EQUAL_GREATER; + } else { + tok->f.kind = T_LESS_EQUAL; + } } else if (_yychar == ':') { if (*(_currentChar+1) != ':' || *(_currentChar+2) == ':' || *(_currentChar+2) == '>') { yyinp(); diff --git a/src/libs/3rdparty/cplusplus/Names.h b/src/libs/3rdparty/cplusplus/Names.h index 7913c9b0bc..ede94eb781 100644 --- a/src/libs/3rdparty/cplusplus/Names.h +++ b/src/libs/3rdparty/cplusplus/Names.h @@ -180,7 +180,7 @@ public: ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> - () [] + () [] <=> */ enum Kind { InvalidOp, @@ -225,7 +225,8 @@ public: ArrowStarOp, ArrowOp, FunctionCallOp, - ArrayAccessOp + ArrayAccessOp, + SpaceShipOp }; public: diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 430b19efbe..cb7bfa3a1b 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -98,10 +98,11 @@ enum { And = 8, Equality = 9, Relational = 10, - Shift = 11, - Additive = 12, - Multiplicative = 13, - PointerToMember = 14 + ThreeWayComp = 11, + Shift = 12, + Additive = 13, + Multiplicative = 14, + PointerToMember = 15 }; } // namespace Precedece @@ -116,29 +117,30 @@ inline int precedence(int tokenKind, bool templateArguments) return Prec::Assignment; switch (tokenKind) { - case T_COMMA: return Prec::Comma; - case T_QUESTION: return Prec::Conditional; - case T_PIPE_PIPE: return Prec::LogicalOr; - case T_AMPER_AMPER: return Prec::LogicalAnd; - case T_PIPE: return Prec::InclusiveOr; - case T_CARET: return Prec::ExclusiveOr; - case T_AMPER: return Prec::And; + case T_COMMA: return Prec::Comma; + case T_QUESTION: return Prec::Conditional; + case T_PIPE_PIPE: return Prec::LogicalOr; + case T_AMPER_AMPER: return Prec::LogicalAnd; + case T_PIPE: return Prec::InclusiveOr; + case T_CARET: return Prec::ExclusiveOr; + case T_AMPER: return Prec::And; case T_EQUAL_EQUAL: - case T_EXCLAIM_EQUAL: return Prec::Equality; + case T_EXCLAIM_EQUAL: return Prec::Equality; case T_GREATER: case T_LESS: case T_LESS_EQUAL: - case T_GREATER_EQUAL: return Prec::Relational; + case T_GREATER_EQUAL: return Prec::Relational; + case T_LESS_EQUAL_GREATER: return Prec::ThreeWayComp; case T_LESS_LESS: - case T_GREATER_GREATER: return Prec::ExclusiveOr; + case T_GREATER_GREATER: return Prec::ExclusiveOr; case T_PLUS: - case T_MINUS: return Prec::Additive; + case T_MINUS: return Prec::Additive; case T_STAR: case T_SLASH: - case T_PERCENT: return Prec::Multiplicative; + case T_PERCENT: return Prec::Multiplicative; case T_ARROW_STAR: - case T_DOT_STAR: return Prec::PointerToMember; - default: return Prec::Unknown; + case T_DOT_STAR: return Prec::PointerToMember; + default: return Prec::Unknown; } } @@ -1300,6 +1302,7 @@ bool Parser::parseOperator(OperatorAST *&node) // ### FIXME case T_GREATER_EQUAL: case T_GREATER_GREATER_EQUAL: case T_LESS_EQUAL: + case T_LESS_EQUAL_GREATER: case T_LESS_LESS_EQUAL: case T_MINUS_EQUAL: case T_PERCENT_EQUAL: diff --git a/src/libs/3rdparty/cplusplus/Token.cpp b/src/libs/3rdparty/cplusplus/Token.cpp index 1d9127b2dd..31fdb2036c 100644 --- a/src/libs/3rdparty/cplusplus/Token.cpp +++ b/src/libs/3rdparty/cplusplus/Token.cpp @@ -91,6 +91,7 @@ const char *token_names[] = { ("<="), ("<<"), ("<<="), + ("<=>"), ("-"), ("-="), ("--"), diff --git a/src/libs/3rdparty/cplusplus/Token.h b/src/libs/3rdparty/cplusplus/Token.h index f545978669..3a04a44a86 100644 --- a/src/libs/3rdparty/cplusplus/Token.h +++ b/src/libs/3rdparty/cplusplus/Token.h @@ -99,6 +99,7 @@ enum Kind { T_LESS_EQUAL, T_LESS_LESS, T_LESS_LESS_EQUAL, + T_LESS_EQUAL_GREATER, T_MINUS, T_MINUS_EQUAL, T_MINUS_MINUS, @@ -446,6 +447,7 @@ struct LanguageFeatures unsigned int cxxEnabled : 1; unsigned int cxx11Enabled : 1; unsigned int cxx14Enabled : 1; + unsigned int cxx20Enabled : 1; unsigned int objCEnabled : 1; unsigned int c99Enabled : 1; }; |