diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2021-12-29 18:59:27 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2021-12-29 23:42:14 -0800 |
commit | 5f67b95d218e1ef3473c39bca2f6491503aeeabe (patch) | |
tree | 095d53b02f0093911e06ab06221d0529f6f7da42 /unwind.h | |
parent | 0b6c09e067981c232cef09f0d82fb9b4a9864553 (diff) | |
download | txr-5f67b95d218e1ef3473c39bca2f6491503aeeabe.tar.gz txr-5f67b95d218e1ef3473c39bca2f6491503aeeabe.tar.bz2 txr-5f67b95d218e1ef3473c39bca2f6491503aeeabe.zip |
Eliminate declaration-after-statement everywhere.
The use of -ansi doesn't by itself diagnose instances of some
constructs we don't want in the project, like mixed
declarations and statements.
* configure (diag_flags): Add -Werror=declaration-after-statement.
This is C only, so filter it out for C++.
Also add -Werror=vla.
* HACKING: Update inaccurate statements about what dialect we
are using. TXR isn't pure C90: some GCC extensions are used.
We even use long long if the configure script detects it as
working, and some C99 library features.
* buf.c (replace_buf, buf_list): Fix by reordering.
* eval.c (op_dohash, op_load_time_lit): Fix by reordering.
* ffi.c (ffi_simple_release): Fix by reordering.
(align_sw_get): Fix empty macro to expand to dummy declaration
so a semicolon after it isn't interpreted as a statement.
On platforms with alignment, remove a semicolon from the macro
so that it requires one.
(ffi_i8_put, ffi_u8_put): Fix by reordering.
* gc.c (gc_init): Fix with extra braces.
* hash.c (hash_init): Fix by reordering.
* lib.c (list_collect_revappend, sub_iter, replace_str,
replace_vec, mapcar_listout, mappend, mapdo, window_map_list,
subst): Fix by reordering.
(gensym, find, rfind, pos, rpos, in, search_common): Fix by
renaming optional argument and using declaration instead of
assignment.
* linenoise/linenoise.c (edit_in_editor): Fix by reordering.
* parser.c (is_balanced_line): Fix by reordering.
* regex.c (nfa_count_one, print_rec): Fix by reordering.
* signal.c (sig_mask): Fix by reordering.
* stream.c (get_string): Fix by renaming optional argument and
using declaration instead of assignment.
* struct.c (lookup_static_slot_desc): Fix by turning mutated
variable into block local.
(umethod_args_fun): Fix by reordering.
(get_special_slot): Fix by new scope via braces.
* sysif.c (usleep_wrap): Fix by new scope via braces.
(setrlimit_wrap): Fix by new scope via braces.
* time.c (time_string_meth, time_parse_meth): Fix by reordering.
* tree.c (tr_do_delete_spec): Fix by new scope via braces.
* unwind.h (uw_block_beg): New macro which doesn't define
RESULTVAR but expects it to refers to an existing one.
(uw_block_begin): Replace do while (0) with enum trick
so that we have a declaration that requires a semicolon,
rather than a statement, allowing declarations to follow.
(uw_match_env_begin): Now opens a scope and features the
same enum trick as in uw_block_begin.
This fixes a declaration-follows-statement issue in
the v_output function in match.c.
(uw_match_env_end): Closes scope opened by uw_match_env_begin.
* unwind.c (revive_cont): Fix by introducing variable, and
using new uw_block_beg macro.
* vm.c (vm_execute_closure): Fix using combination of local
variable and reordering.
Diffstat (limited to 'unwind.h')
-rw-r--r-- | unwind.h | 17 |
1 files changed, 15 insertions, 2 deletions
@@ -398,6 +398,16 @@ NORETURN void invalid_op(val self, val obj); return VAL; \ } while (0) +#define uw_block_beg(TAG, RESULTVAR) \ + do { \ + uw_frame_t uw_blk; \ + obj_t **uw_rslt = &RESULTVAR; \ + uw_push_block(&uw_blk, TAG); \ + if (extended_setjmp(uw_blk.bl.jb)) { \ + RESULTVAR = uw_blk.bl.result; \ + } else { \ + enum { dummy ## __LINE__ } + #define uw_block_begin(TAG, RESULTVAR) \ obj_t *RESULTVAR = nil; \ do { \ @@ -407,7 +417,7 @@ NORETURN void invalid_op(val self, val obj); if (extended_setjmp(uw_blk.bl.jb)) { \ RESULTVAR = uw_blk.bl.result; \ } else { \ - do { } while (0) + enum { dummy ## __LINE__ } #define uw_block_end \ } \ @@ -417,9 +427,12 @@ NORETURN void invalid_op(val self, val obj); #define uw_match_env_begin \ do { \ uw_frame_t uw_env; \ - uw_push_match_env(&uw_env) + uw_push_match_env(&uw_env); \ + { \ + enum { dummy ## __LINE__ } #define uw_match_env_end \ + } \ uw_pop_frame(&uw_env); \ } while (0) |