patch 8.2.0173: build fails with old compiler
Problem: Build fails with old compiler.
Solution: Do not use anonymous unions. (John Marriott)
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 524bcde..772355a 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -88,7 +88,7 @@
whilescope_T se_while;
forscope_T se_for;
tryscope_T se_try;
- };
+ } se_u;
};
/*
@@ -3506,7 +3506,7 @@
return NULL;
// "where" is set when ":elseif", "else" or ":endif" is found
- scope->se_if.is_if_label = instr->ga_len;
+ scope->se_u.se_if.is_if_label = instr->ga_len;
generate_JUMP(cctx, JUMP_IF_FALSE, 0);
return p;
@@ -3528,12 +3528,12 @@
cctx->ctx_locals.ga_len = scope->se_local_count;
// jump from previous block to the end
- if (compile_jump_to_end(&scope->se_if.is_end_label,
+ if (compile_jump_to_end(&scope->se_u.se_if.is_end_label,
JUMP_ALWAYS, cctx) == FAIL)
return NULL;
// previous "if" or "elseif" jumps here
- isn = ((isn_T *)instr->ga_data) + scope->se_if.is_if_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
// compile "expr"
@@ -3541,7 +3541,7 @@
return NULL;
// "where" is set when ":elseif", "else" or ":endif" is found
- scope->se_if.is_if_label = instr->ga_len;
+ scope->se_u.se_if.is_if_label = instr->ga_len;
generate_JUMP(cctx, JUMP_IF_FALSE, 0);
return p;
@@ -3563,12 +3563,12 @@
cctx->ctx_locals.ga_len = scope->se_local_count;
// jump from previous block to the end
- if (compile_jump_to_end(&scope->se_if.is_end_label,
+ if (compile_jump_to_end(&scope->se_u.se_if.is_end_label,
JUMP_ALWAYS, cctx) == FAIL)
return NULL;
// previous "if" or "elseif" jumps here
- isn = ((isn_T *)instr->ga_data) + scope->se_if.is_if_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
return p;
@@ -3587,12 +3587,12 @@
emsg(_(e_endif_without_if));
return NULL;
}
- ifscope = &scope->se_if;
+ ifscope = &scope->se_u.se_if;
cctx->ctx_scope = scope->se_outer;
cctx->ctx_locals.ga_len = scope->se_local_count;
// previous "if" or "elseif" jumps here
- isn = ((isn_T *)instr->ga_data) + scope->se_if.is_if_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_if.is_if_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
// Fill in the "end" label in jumps at the end of the blocks.
@@ -3688,7 +3688,7 @@
}
// "for_end" is set when ":endfor" is found
- scope->se_for.fs_top_label = instr->ga_len;
+ scope->se_u.se_for.fs_top_label = instr->ga_len;
generate_FOR(cctx, loop_idx);
generate_STORE(cctx, ISN_STORE, var_idx, NULL);
@@ -3712,7 +3712,7 @@
emsg(_(e_for));
return NULL;
}
- forscope = &scope->se_for;
+ forscope = &scope->se_u.se_for;
cctx->ctx_scope = scope->se_outer;
cctx->ctx_locals.ga_len = scope->se_local_count;
@@ -3757,14 +3757,14 @@
if (scope == NULL)
return NULL;
- scope->se_while.ws_top_label = instr->ga_len;
+ scope->se_u.se_while.ws_top_label = instr->ga_len;
// compile "expr"
if (compile_expr1(&p, cctx) == FAIL)
return NULL;
// "while_end" is set when ":endwhile" is found
- if (compile_jump_to_end(&scope->se_while.ws_end_label,
+ if (compile_jump_to_end(&scope->se_u.se_while.ws_end_label,
JUMP_IF_FALSE, cctx) == FAIL)
return FAIL;
@@ -3788,11 +3788,11 @@
cctx->ctx_locals.ga_len = scope->se_local_count;
// At end of ":for" scope jump back to the FOR instruction.
- generate_JUMP(cctx, JUMP_ALWAYS, scope->se_while.ws_top_label);
+ generate_JUMP(cctx, JUMP_ALWAYS, scope->se_u.se_while.ws_top_label);
// Fill in the "end" label in the WHILE statement so it can jump here.
// And in any jumps for ":break"
- compile_fill_jump_to_end(&scope->se_while.ws_end_label, cctx);
+ compile_fill_jump_to_end(&scope->se_u.se_while.ws_end_label, cctx);
vim_free(scope);
@@ -3821,8 +3821,8 @@
// Jump back to the FOR or WHILE instruction.
generate_JUMP(cctx, JUMP_ALWAYS,
- scope->se_type == FOR_SCOPE ? scope->se_for.fs_top_label
- : scope->se_while.ws_top_label);
+ scope->se_type == FOR_SCOPE ? scope->se_u.se_for.fs_top_label
+ : scope->se_u.se_while.ws_top_label);
return arg;
}
@@ -3849,9 +3849,9 @@
// Jump to the end of the FOR or WHILE loop.
if (scope->se_type == FOR_SCOPE)
- el = &scope->se_for.fs_end_label;
+ el = &scope->se_u.se_for.fs_end_label;
else
- el = &scope->se_while.ws_end_label;
+ el = &scope->se_u.se_while.ws_end_label;
if (compile_jump_to_end(el, JUMP_ALWAYS, cctx) == FAIL)
return FAIL;
@@ -3928,7 +3928,7 @@
// "catch" is set when the first ":catch" is found.
// "finally" is set when ":finally" or ":endtry" is found
- try_scope->se_try.ts_try_label = instr->ga_len;
+ try_scope->se_u.se_try.ts_try_label = instr->ga_len;
if (generate_instr(cctx, ISN_TRY) == NULL)
return NULL;
@@ -3963,33 +3963,33 @@
return NULL;
}
- if (scope->se_try.ts_caught_all)
+ if (scope->se_u.se_try.ts_caught_all)
{
emsg(_("E1033: catch unreachable after catch-all"));
return NULL;
}
// Jump from end of previous block to :finally or :endtry
- if (compile_jump_to_end(&scope->se_try.ts_end_label,
+ if (compile_jump_to_end(&scope->se_u.se_try.ts_end_label,
JUMP_ALWAYS, cctx) == FAIL)
return NULL;
// End :try or :catch scope: set value in ISN_TRY instruction
- isn = ((isn_T *)instr->ga_data) + scope->se_try.ts_try_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
if (isn->isn_arg.try.try_catch == 0)
isn->isn_arg.try.try_catch = instr->ga_len;
- if (scope->se_try.ts_catch_label != 0)
+ if (scope->se_u.se_try.ts_catch_label != 0)
{
// Previous catch without match jumps here
- isn = ((isn_T *)instr->ga_data) + scope->se_try.ts_catch_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
}
p = skipwhite(arg);
if (ends_excmd(*p))
{
- scope->se_try.ts_caught_all = TRUE;
- scope->se_try.ts_catch_label = 0;
+ scope->se_u.se_try.ts_caught_all = TRUE;
+ scope->se_u.se_try.ts_catch_label = 0;
}
else
{
@@ -4003,7 +4003,7 @@
if (generate_COMPARE(cctx, EXPR_MATCH, FALSE) == FAIL)
return NULL;
- scope->se_try.ts_catch_label = instr->ga_len;
+ scope->se_u.se_try.ts_catch_label = instr->ga_len;
if (generate_JUMP(cctx, JUMP_IF_FALSE, 0) == FAIL)
return NULL;
}
@@ -4036,7 +4036,7 @@
}
// End :catch or :finally scope: set value in ISN_TRY instruction
- isn = ((isn_T *)instr->ga_data) + scope->se_try.ts_try_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
if (isn->isn_arg.try.try_finally != 0)
{
emsg(_(e_finally_dup));
@@ -4044,12 +4044,12 @@
}
// Fill in the "end" label in jumps at the end of the blocks.
- compile_fill_jump_to_end(&scope->se_try.ts_end_label, cctx);
+ compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label, cctx);
- if (scope->se_try.ts_catch_label != 0)
+ if (scope->se_u.se_try.ts_catch_label != 0)
{
// Previous catch without match jumps here
- isn = ((isn_T *)instr->ga_data) + scope->se_try.ts_catch_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_catch_label;
isn->isn_arg.jump.jump_where = instr->ga_len;
}
@@ -4085,7 +4085,7 @@
return NULL;
}
- isn = ((isn_T *)instr->ga_data) + scope->se_try.ts_try_label;
+ isn = ((isn_T *)instr->ga_data) + scope->se_u.se_try.ts_try_label;
if (isn->isn_arg.try.try_catch == 0 && isn->isn_arg.try.try_finally == 0)
{
emsg(_("E1032: missing :catch or :finally"));
@@ -4094,7 +4094,7 @@
// Fill in the "end" label in jumps at the end of the blocks, if not done
// by ":finally".
- compile_fill_jump_to_end(&scope->se_try.ts_end_label, cctx);
+ compile_fill_jump_to_end(&scope->se_u.se_try.ts_end_label, cctx);
// End :catch or :finally scope: set value in ISN_TRY instruction
if (isn->isn_arg.try.try_finally == 0)