Skip to content

Commit f761fcb

Browse files
committed
Parser: constexpr/constinit structured bindings, co_await/co_yield as expressions
- isStructuredBindingStart: now recognizes constexpr/constinit before auto e.g. 'constexpr auto [a, b] = p;' -- C++17/20 constexpr structured binding - parseStructuredBinding: consume constexpr/constinit before auto - parsePrimary: co_await and co_yield now handled as unary prefix expressions so 'int x = co_await awaitable;' parses correctly (previously only worked as standalone statements)
1 parent df5e924 commit f761fcb

2 files changed

Lines changed: 7 additions & 0 deletions

File tree

mode/CppMode.jar

53 Bytes
Binary file not shown.

src/java/Parser.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3162,7 +3162,11 @@ private void consumeAttributes() {
31623162

31633163
private boolean isStructuredBindingStart() {
31643164
int i = pos;
3165+
// Consume optional leading qualifiers: const, constexpr, constinit
31653166
if (i < tokens.size() && tokens.get(i).isKeyword("const")) i++;
3167+
if (i < tokens.size() && tokens.get(i).isKeyword("constexpr")) i++;
3168+
if (i < tokens.size() && tokens.get(i).isKeyword("constinit")) i++;
3169+
if (i < tokens.size() && tokens.get(i).isKeyword("const")) i++; // const after constexpr
31663170
if (i >= tokens.size() || !tokens.get(i).isKeyword("auto")) return false;
31673171
i++;
31683172
if (i < tokens.size() && (tokens.get(i).isOp("&") || tokens.get(i).isOp("&&"))) i++;
@@ -3172,6 +3176,9 @@ private boolean isStructuredBindingStart() {
31723176
private Statement parseStructuredBinding(List<CppLexerToken> leadingComments) {
31733177
CppLexerToken start = peek();
31743178
matchKeyword("const");
3179+
matchKeyword("constexpr");
3180+
matchKeyword("constinit");
3181+
matchKeyword("const"); // const after constexpr
31753182
expectKeyword("auto");
31763183
matchOp("&"); matchOp("&&");
31773184
expectPunct("[");

0 commit comments

Comments
 (0)