summaryrefslogtreecommitdiff
path: root/libguile/inline.h
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2006-06-17 23:15:59 +0000
committerKevin Ryde <user42@zip.com.au>2006-06-17 23:15:59 +0000
commit23f2b9a3de013f093c5913aa381219f09353c676 (patch)
tree3a3315e24402e90d9c4094f18ac7ab6c2047f31f /libguile/inline.h
parenta4f1c77ddb2057ca630b8bed9be437bdbc5dc552 (diff)
downloadguile-23f2b9a3de013f093c5913aa381219f09353c676.tar.gz
merge from 1.8 branch
Diffstat (limited to 'libguile/inline.h')
-rw-r--r--libguile/inline.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/libguile/inline.h b/libguile/inline.h
index 0f7f7aa01..621b4fb36 100644
--- a/libguile/inline.h
+++ b/libguile/inline.h
@@ -248,6 +248,27 @@ SCM_C_INLINE
int
scm_is_pair (SCM x)
{
+ /* The following "workaround_for_gcc_295" avoids bad code generated by
+ i386 gcc 2.95.4 (the Debian packaged 2.95.4-24 at least).
+
+ Under the default -O2 the inlined SCM_I_CONSP test gets "optimized" so
+ the fetch of the tag word from x is done before confirming it's a
+ non-immediate (SCM_NIMP). Needless to say that bombs badly if x is a
+ immediate. This was seen to afflict scm_srfi1_split_at and something
+ deep in the bowels of ceval(). In both cases segvs resulted from
+ deferencing a random immediate value. srfi-1.test exposes the problem
+ through a short list, the immediate being SCM_EOL in that case.
+ Something in syntax.test exposed the ceval() problem.
+
+ Just "volatile SCM workaround_for_gcc_295 = lst" is enough to avoid the
+ problem, without even using that variable. The "w=w" is just to
+ prevent a warning about it being unused.
+ */
+#if defined (__GNUC__) && __GNUC__ == 2 && __GNUC_MINOR__ == 95
+ volatile SCM workaround_for_gcc_295 = x;
+ workaround_for_gcc_295 = workaround_for_gcc_295;
+#endif
+
return SCM_I_CONSP (x);
}