summaryrefslogtreecommitdiffstats
path: root/vendor/modernc.org/cc/v3/parser.go
diff options
context:
space:
mode:
authorWim <wim@42.be>2022-11-27 00:42:16 +0100
committerGitHub <noreply@github.com>2022-11-27 00:42:16 +0100
commit4fd0a7672777f0ed15692ae2ba47838208537558 (patch)
treeb119834a8b9ee78aa8f1b2ad05efa7da50516cbf /vendor/modernc.org/cc/v3/parser.go
parent6da9d567dc9195e9a5211f23a6795a41f56a1bfc (diff)
downloadmatterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.tar.gz
matterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.tar.bz2
matterbridge-msglm-4fd0a7672777f0ed15692ae2ba47838208537558.zip
Update dependencies (#1929)
Diffstat (limited to 'vendor/modernc.org/cc/v3/parser.go')
-rw-r--r--vendor/modernc.org/cc/v3/parser.go73
1 files changed, 46 insertions, 27 deletions
diff --git a/vendor/modernc.org/cc/v3/parser.go b/vendor/modernc.org/cc/v3/parser.go
index d73b2c6b..a2b5f3c7 100644
--- a/vendor/modernc.org/cc/v3/parser.go
+++ b/vendor/modernc.org/cc/v3/parser.go
@@ -3162,28 +3162,49 @@ func (p *parser) designator(acceptCol bool) (*Designator, bool) {
// iteration-statement
// jump-statement
// asm-statement
-func (p *parser) statement() *Statement {
- switch p.rune() {
- case IDENTIFIER:
- if p.peek(false) == ':' {
- return &Statement{Case: StatementLabeled, LabeledStatement: p.labeledStatement()}
+func (p *parser) statement() (r *Statement) {
+ var r0 *Statement
+ var prevLS, ls *LabeledStatement
+
+ defer func() {
+ if ls != nil {
+ ls.Statement = r
+ r = r0
}
+ }()
- return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()}
- case '{':
- return &Statement{Case: StatementCompound, CompoundStatement: p.compoundStatement(nil, nil)}
- case IF, SWITCH:
- return &Statement{Case: StatementSelection, SelectionStatement: p.selectionStatement()}
- case WHILE, DO, FOR:
- return &Statement{Case: StatementIteration, IterationStatement: p.iterationStatement()}
- case GOTO, BREAK, CONTINUE, RETURN:
- return &Statement{Case: StatementJump, JumpStatement: p.jumpStatement()}
- case CASE, DEFAULT:
- return &Statement{Case: StatementLabeled, LabeledStatement: p.labeledStatement()}
- case ASM:
- return &Statement{Case: StatementAsm, AsmStatement: p.asmStatement()}
- default:
- return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()}
+ for {
+ switch p.rune() {
+ case IDENTIFIER:
+ switch {
+ case p.peek(false) == ':':
+ ls = p.labeledStatement()
+ default:
+ return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()}
+ }
+ case '{':
+ return &Statement{Case: StatementCompound, CompoundStatement: p.compoundStatement(nil, nil)}
+ case IF, SWITCH:
+ return &Statement{Case: StatementSelection, SelectionStatement: p.selectionStatement()}
+ case WHILE, DO, FOR:
+ return &Statement{Case: StatementIteration, IterationStatement: p.iterationStatement()}
+ case GOTO, BREAK, CONTINUE, RETURN:
+ return &Statement{Case: StatementJump, JumpStatement: p.jumpStatement()}
+ case CASE, DEFAULT:
+ ls = p.labeledStatement()
+ case ASM:
+ return &Statement{Case: StatementAsm, AsmStatement: p.asmStatement()}
+ default:
+ return &Statement{Case: StatementExpr, ExpressionStatement: p.expressionStatement()}
+ }
+
+ switch {
+ case r0 == nil:
+ r0 = &Statement{Case: StatementLabeled, LabeledStatement: ls}
+ default:
+ prevLS.Statement = &Statement{Case: StatementLabeled, LabeledStatement: ls}
+ }
+ prevLS = ls
}
}
@@ -3220,7 +3241,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) {
p.block.hasLabel()
r = &LabeledStatement{
Case: LabeledStatementLabel, Token: t, Token2: t2, AttributeSpecifierList: attr,
- Statement: p.statement(), lexicalScope: p.declScope, block: p.block,
+ lexicalScope: p.declScope, block: p.block,
}
p.declScope.declare(t.Value, r)
return r
@@ -3246,8 +3267,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) {
return &LabeledStatement{
Case: LabeledStatementRange, Token: t, ConstantExpression: e,
Token2: t2, ConstantExpression2: e2, Token3: t3,
- Statement: p.statement(), lexicalScope: p.declScope,
- block: p.block,
+ lexicalScope: p.declScope, block: p.block,
}
case ':':
t2 = p.shift()
@@ -3256,8 +3276,7 @@ func (p *parser) labeledStatement() (r *LabeledStatement) {
}
return &LabeledStatement{
Case: LabeledStatementCaseLabel, Token: t, ConstantExpression: e,
- Token2: t2, Statement: p.statement(), lexicalScope: p.declScope,
- block: p.block,
+ Token2: t2, lexicalScope: p.declScope, block: p.block,
}
case DEFAULT:
if p.switches == 0 {
@@ -3271,12 +3290,12 @@ func (p *parser) labeledStatement() (r *LabeledStatement) {
p.err("expected :")
}
return &LabeledStatement{
- Case: LabeledStatementDefault, Token: t, Token2: t2, Statement: p.statement(),
+ Case: LabeledStatementDefault, Token: t, Token2: t2,
lexicalScope: p.declScope, block: p.block,
}
default:
p.err("expected labeled-statement")
- return nil
+ return &LabeledStatement{}
}
}