summaryrefslogtreecommitdiffstats
path: root/ffi.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2021-12-29 18:59:27 -0800
committerKaz Kylheku <kaz@kylheku.com>2021-12-29 23:42:14 -0800
commit5f67b95d218e1ef3473c39bca2f6491503aeeabe (patch)
tree095d53b02f0093911e06ab06221d0529f6f7da42 /ffi.c
parent0b6c09e067981c232cef09f0d82fb9b4a9864553 (diff)
downloadtxr-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 'ffi.c')
-rw-r--r--ffi.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/ffi.c b/ffi.c
index a383c831..767d7a9b 100644
--- a/ffi.c
+++ b/ffi.c
@@ -509,17 +509,17 @@ static val ffi_void_get(struct txr_ffi_type *tft, mem_t *src, val self)
static void ffi_simple_release(struct txr_ffi_type *tft, val obj,
mem_t *dst, val self)
{
+ mem_t **loc = coerce(mem_t **, dst);
(void) tft;
(void) obj;
(void) self;
- mem_t **loc = coerce(mem_t **, dst);
free(*loc);
*loc = 0;
}
#if __i386__ || __x86_64__ || __PPC64__ || __ARM_FEATURE_UNALIGNED
-#define align_sw_get(type, src)
+#define align_sw_get(type, src) enum { dummy ## __LINE__ }
#define align_sw_end
#define align_sw_put_end
#define align_sw_put(type, dst, expr) (expr)
@@ -531,7 +531,7 @@ static void ffi_simple_release(struct txr_ffi_type *tft, val obj,
const size_t sz = sizeof (type); \
mem_t *src_prev = src; \
mem_t *buf = al ? src : convert(mem_t *, alloca(sz)); \
- mem_t *src = al ? buf : (memcpy(buf, src_prev, sz), buf);
+ mem_t *src = al ? buf : (memcpy(buf, src_prev, sz), buf)
#define align_sw_end \
}
@@ -557,8 +557,8 @@ static void ffi_simple_release(struct txr_ffi_type *tft, val obj,
#if HAVE_I8
static void ffi_i8_put(struct txr_ffi_type *tft, val n, mem_t *dst, val self)
{
- (void) tft;
i8_t v = c_i8(n, self);
+ (void) tft;
*coerce(i8_t *, dst) = v;
}
@@ -571,8 +571,8 @@ static val ffi_i8_get(struct txr_ffi_type *tft, mem_t *src, val self)
static void ffi_u8_put(struct txr_ffi_type *tft, val n, mem_t *dst, val self)
{
- (void) tft;
u8_t v = c_u8(n, self);
+ (void) tft;
*coerce(u8_t *, dst) = v;
}