summaryrefslogtreecommitdiff
path: root/libguile/error.h
diff options
context:
space:
mode:
authorJim Blandy <jimb@red-bean.com>1996-12-18 21:39:44 +0000
committerJim Blandy <jimb@red-bean.com>1996-12-18 21:39:44 +0000
commit3323ad081e607467dccf7c68d9c33e8f99a8fd85 (patch)
tree0bdeeb66eb193661bfb58f9b82af973c96e012ea /libguile/error.h
parent1b306e162338208673289a3275bcebb8f8a6c048 (diff)
downloadguile-3323ad081e607467dccf7c68d9c33e8f99a8fd85.tar.gz
Give GCC more control flow information, so it can be sure that
variables aren't used uninitialized. * error.h (scm_error, scm_syserror, scm_syserror_msg, scm_sysmissing, scm_num_overflow, scm_out_of_range, scm_wrong_num_args, scm_wrong_type_arg, scm_memory_error, scm_misc_error): Tell GCC that these functions never return. * struct.c (scm_struct_ref, scm_struct_set_x): If we can't figure out the field type, call abort if SCM_ASSERT returns, to placate the optimizer. * stacks.c (scm_make_stack, scm_last_stack_frame): abort if scm_wta ever returns. We can't handle this case anyway, and this gives the optimizer more information. * unif.c (scm_uniform_vector_ref, scm_array_set_x): Abort if scm_wta ever returns.
Diffstat (limited to 'libguile/error.h')
-rw-r--r--libguile/error.h33
1 files changed, 23 insertions, 10 deletions
diff --git a/libguile/error.h b/libguile/error.h
index 385497e8f..0ce16289a 100644
--- a/libguile/error.h
+++ b/libguile/error.h
@@ -50,21 +50,34 @@ extern int scm_ints_disabled;
+/* GCC can be told that a function doesn't return; this helps it do
+ better error checking (for uninitialized variable use, for
+ example), and some optimization. */
+#ifdef __GNUC__
+#define SCM_NORETURN __attribute__ ((noreturn))
+#else
+#define SCM_NORETURN
+#endif
+
+
extern SCM scm_errno SCM_P ((SCM arg));
extern SCM scm_perror SCM_P ((SCM arg));
extern void scm_error SCM_P ((SCM key, char *subr, char *message,
- SCM args, SCM rest));
+ SCM args, SCM rest)) SCM_NORETURN;
extern void (*scm_error_callback) SCM_P ((SCM key, char *subr,
char *message, SCM args, SCM rest));
-extern void scm_syserror SCM_P ((char *subr));
-extern void scm_syserror_msg SCM_P ((char *subr, char *message, SCM args));
-extern void scm_sysmissing SCM_P ((char *subr));
-extern void scm_num_overflow SCM_P ((char *subr));
-extern void scm_out_of_range SCM_P ((char *subr, SCM bad_value));
-extern void scm_wrong_num_args SCM_P ((SCM proc));
-extern void scm_wrong_type_arg SCM_P ((char *subr, int pos, SCM bad_value));
-extern void scm_memory_error SCM_P ((char *subr));
-extern void scm_misc_error SCM_P ((char *subr, char *message, SCM args));
+extern void scm_syserror SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_syserror_msg SCM_P ((char *subr, char *message, SCM args))
+ SCM_NORETURN;
+extern void scm_sysmissing SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_num_overflow SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_out_of_range SCM_P ((char *subr, SCM bad_value)) SCM_NORETURN;
+extern void scm_wrong_num_args SCM_P ((SCM proc)) SCM_NORETURN;
+extern void scm_wrong_type_arg SCM_P ((char *subr, int pos, SCM bad_value))
+ SCM_NORETURN;
+extern void scm_memory_error SCM_P ((char *subr)) SCM_NORETURN;
+extern void scm_misc_error SCM_P ((char *subr, char *message, SCM args))
+ SCM_NORETURN;
extern SCM scm_wta SCM_P ((SCM arg, char *pos, char *s_subr));
extern void scm_init_error SCM_P ((void));