CPlusPlus: Add parser support for declarations of user-defined literals

... without a space before the identifier.

Change-Id: I977ffae82eb86f5ae6ea594cba17cc486e63bf6c
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
Christian Kandeler
2024-08-06 17:06:10 +02:00
parent 5f3a343352
commit 9926de01c1
4 changed files with 22 additions and 14 deletions

View File

@@ -1533,14 +1533,21 @@ bool Parser::parseOperator(OperatorAST *&node) // ### FIXME
} else if (LA() == T_LBRACKET && LA(2) == T_RBRACKET) {
ast->op_token = ast->open_token = consumeToken();
ast->close_token = consumeToken();
} else if (_languageFeatures.cxx11Enabled &&
LA() == T_STRING_LITERAL && LA(2) == T_IDENTIFIER &&
!tok().f.userDefinedLiteral && tok().string->size() == 0 &&
tok(2).identifier->size() > 1 && tok(2).identifier->chars()[0] == '_') {
} else if (_languageFeatures.cxx11Enabled && LA() == T_STRING_LITERAL) {
// C++11 user-defined literal operator, e.g.:
// int operator"" _abc123(const char *str, size_t size) { ... }
ast->op_token = consumeToken();
consumeToken(); // consume literal operator identifier
// There are two variants: With and without a space after the quotes. The former
// is deprecated.
if (LA(2) == T_IDENTIFIER && !tok().f.userDefinedLiteral
&& tok().string->size() == 0 &&
tok(2).identifier->size() > 1 && tok(2).identifier->chars()[0] == '_') {
ast->op_token = consumeToken();
consumeToken(); // consume literal operator identifier
} else if (tok().f.userDefinedLiteral) {
ast->op_token = consumeToken();
} else {
return false;
}
} else {
return false;
}