Commit ae5c7e25 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Fix a very strange corner-case of vcl syntax level handling.

Spotted by:	simon
parent a5b03294
...@@ -76,7 +76,6 @@ struct symbol; ...@@ -76,7 +76,6 @@ struct symbol;
struct source { struct source {
VTAILQ_ENTRY(source) list; VTAILQ_ENTRY(source) list;
int syntax;
char *name; char *name;
const char *b; const char *b;
const char *e; const char *e;
......
...@@ -276,6 +276,7 @@ static void ...@@ -276,6 +276,7 @@ static void
vcc_ParseVcl(struct vcc *tl) vcc_ParseVcl(struct vcc *tl)
{ {
struct token *tok0, *tok1, *tok2; struct token *tok0, *tok1, *tok2;
int syntax;
assert(vcc_IdIs(tl->t, "vcl")); assert(vcc_IdIs(tl->t, "vcl"));
tok0 = tl->t; tok0 = tl->t;
...@@ -283,14 +284,14 @@ vcc_ParseVcl(struct vcc *tl) ...@@ -283,14 +284,14 @@ vcc_ParseVcl(struct vcc *tl)
tok1 = tl->t; tok1 = tl->t;
Expect(tl, CNUM); Expect(tl, CNUM);
tok1->src->syntax = (*tl->t->b - '0') * 10; syntax = (*tl->t->b - '0') * 10;
vcc_NextToken(tl); vcc_NextToken(tl);
Expect(tl, '.'); Expect(tl, '.');
vcc_NextToken(tl); vcc_NextToken(tl);
Expect(tl, CNUM); Expect(tl, CNUM);
tok2 = tl->t; tok2 = tl->t;
tok1->src->syntax += (*tl->t->b - '0'); syntax += (*tl->t->b - '0');
vcc_NextToken(tl); vcc_NextToken(tl);
if (tok1->e - tok1->b != 1 || tok2->e - tok2->b != 1) { if (tok1->e - tok1->b != 1 || tok2->e - tok2->b != 1) {
...@@ -300,6 +301,13 @@ vcc_ParseVcl(struct vcc *tl) ...@@ -300,6 +301,13 @@ vcc_ParseVcl(struct vcc *tl)
ERRCHK(tl); ERRCHK(tl);
} }
if (syntax < VCL_LOW || syntax > VCL_HIGH) {
VSB_printf(tl->sb, "VCL version %.1f not supported.\n",
.1 * syntax);
vcc_ErrWhere2(tl, tok0, tl->t);
ERRCHK(tl);
}
if (tl->t->tok != ';') { if (tl->t->tok != ';') {
/* Special handling, because next token might be 'vcl' /* Special handling, because next token might be 'vcl'
* in the built-in VCL, and that would give a very * in the built-in VCL, and that would give a very
...@@ -311,11 +319,13 @@ vcc_ParseVcl(struct vcc *tl) ...@@ -311,11 +319,13 @@ vcc_ParseVcl(struct vcc *tl)
ERRCHK(tl); ERRCHK(tl);
} }
vcc_NextToken(tl); vcc_NextToken(tl);
if (tl->syntax != 0.0 && tok1->src->syntax > tl->syntax) { if (tl->syntax == 0)
tl->syntax = syntax;
if (syntax > tl->syntax) {
VSB_printf(tl->sb, VSB_printf(tl->sb,
"VCL version %.1f higher than" "VCL version %.1f higher than"
" the top level version %.1f\n", " the top level version %.1f\n",
.1 * tok1->src->syntax, .1 * tl->syntax); .1 * syntax, .1 * tl->syntax);
vcc_ErrWhere2(tl, tok0, tl->t); vcc_ErrWhere2(tl, tok0, tl->t);
ERRCHK(tl); ERRCHK(tl);
} }
...@@ -352,7 +362,6 @@ void ...@@ -352,7 +362,6 @@ void
vcc_Parse(struct vcc *tl) vcc_Parse(struct vcc *tl)
{ {
struct toplev *tp; struct toplev *tp;
struct token *tok;
AZ(tl->indent); AZ(tl->indent);
if (tl->t->tok != ID || !vcc_IdIs(tl->t, "vcl")) { if (tl->t->tok != ID || !vcc_IdIs(tl->t, "vcl")) {
...@@ -365,16 +374,9 @@ vcc_Parse(struct vcc *tl) ...@@ -365,16 +374,9 @@ vcc_Parse(struct vcc *tl)
vcc_ErrWhere(tl, tl->t); vcc_ErrWhere(tl, tl->t);
ERRCHK(tl); ERRCHK(tl);
} }
tok = tl->t;
vcc_ParseVcl(tl); vcc_ParseVcl(tl);
if (tok->src->syntax < VCL_LOW || tok->src->syntax > VCL_HIGH) {
VSB_printf(tl->sb, "VCL version %.1f not supported.\n",
.1 * tok->src->syntax);
vcc_ErrWhere2(tl, tok, tl->t);
ERRCHK(tl);
}
tl->syntax = tl->t->src->syntax;
ERRCHK(tl); ERRCHK(tl);
AN(tl->syntax);
while (tl->t->tok != EOI) { while (tl->t->tok != EOI) {
ERRCHK(tl); ERRCHK(tl);
switch (tl->t->tok) { switch (tl->t->tok) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment