aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2022-10-20 13:43:10 +0200
committerDavid Schulz <david.schulz@qt.io>2023-01-30 05:47:41 +0000
commit4e8b7eee9ddf2feb8f7ced24bb9425539059e698 (patch)
treefc78b4bb4ebbe8e2cb3968ecc4b8ee664401ad7c /src/libs/3rdparty/cplusplus
parentc780151aece1ca31dfe4a283058295469832d56a (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.cpp4
-rw-r--r--src/libs/3rdparty/cplusplus/Lexer.cpp7
-rw-r--r--src/libs/3rdparty/cplusplus/Names.h5
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp39
-rw-r--r--src/libs/3rdparty/cplusplus/Token.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/Token.h2
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;
};