ISO C++ demands (in 7.1.2.4) "If a function with external linkage is declared inline in one translation unit, it shall be declared inline in all translation units in which it appears; no diagnostic is required." MAYBE_INLINE violates this requirement. Moreover, it's pointless, since the compiler emits those functions anyway. This causes link errors on non-ELF platforms (such as woe32 and Darwin). Hence, I decided to replace MAYBE_INLINE with standard compliant (but more intrusive) code. Only fiew occurences of MAYBE_INLINE have been converted. However, this happens to be enough to build CLN as a woe32 DLL (after massive hacking of build scripts). --- src/complex/transcendental/cl_C_acosh.cc | 7 ++++--- src/complex/transcendental/cl_C_asinh_aux.cc | 11 ++++++----- src/complex/transcendental/cl_C_atanh_aux.cc | 10 ++++++---- src/float/dfloat/misc/cl_DF_signum.cc | 9 +++++++-- src/float/ffloat/misc/cl_FF_signum.cc | 10 ++++++++-- src/float/lfloat/misc/cl_LF_signum.cc | 9 +++++++-- src/float/misc/cl_F_signum.cc | 16 ++++++++++------ src/float/sfloat/misc/cl_SF_signum.cc | 9 +++++++-- src/integer/misc/cl_I_signum.cc | 9 +++++++-- src/integer/ring/cl_I_ring.cc | 5 ++++- src/rational/misc/cl_RA_signum.cc | 10 ++++++++-- src/rational/ring/cl_RA_ring.cc | 5 ++++- src/real/conv/cl_F_from_R_def.cc | 9 +++++++-- src/real/misc/cl_R_signum.cc | 19 ++++++++++++++----- 14 files changed, 99 insertions(+), 39 deletions(-) diff --git a/src/complex/transcendental/cl_C_acosh.cc b/src/complex/transcendental/cl_C_acosh.cc index 2fb952f..79f1f6e 100644 --- a/src/complex/transcendental/cl_C_acosh.cc +++ b/src/complex/transcendental/cl_C_acosh.cc @@ -16,8 +16,9 @@ #include "cl_RA.h" #include "cln/float.h" -#undef MAYBE_INLINE -#define MAYBE_INLINE inline +#define INLINE static inline +#define INLINE_DECL(fcn) inline_ ## fcn +#define REALLY_INLINE __attribute__((always_inline)) #include "cl_F_from_R_def.cc" namespace cln { @@ -78,7 +79,7 @@ const cl_N acosh (const cl_N& z) } if (x < cl_I(-1)) { // x < -1 - var cl_F xf = cl_float(x); + var cl_F xf = inline_cl_float(x); var cl_F& x = xf; // x Float <= -1 // log(sqrt(x^2-1)-x), ein Float >=0, Imaginärteil pi diff --git a/src/complex/transcendental/cl_C_asinh_aux.cc b/src/complex/transcendental/cl_C_asinh_aux.cc index 623ab30..62f4c67 100644 --- a/src/complex/transcendental/cl_C_asinh_aux.cc +++ b/src/complex/transcendental/cl_C_asinh_aux.cc @@ -16,8 +16,9 @@ #include "cl_RA.h" #include "cln/float.h" -#undef MAYBE_INLINE -#define MAYBE_INLINE inline +#define INLINE static inline +#define INLINE_DECL(fcn) inline_ ## fcn +#define REALLY_INLINE __attribute__((always_inline)) #include "cl_F_from_R_def.cc" namespace cln { @@ -89,7 +90,7 @@ const cl_C_R asinh (const cl_R& x, const cl_R& y) return cl_C_R(0,scale_float(pi(),-1)); if (eq(y,-1)) // x=0, y=-1 -> v = -pi/2 return cl_C_R(0,-scale_float(pi(),-1)); - yf = cl_float(y); // y in Float umwandeln + yf = inline_cl_float(y); // y in Float umwandeln } else { DeclareType(cl_RT,y); // y Ratio @@ -99,7 +100,7 @@ const cl_C_R asinh (const cl_R& x, const cl_R& y) if (eq(numerator(y),-1)) // x=0, y=-1/2 -> v = -pi/6 return cl_C_R(0,-(pi()/6)); } - yf = cl_float(y); // y in Float umwandeln + yf = inline_cl_float(y); // y in Float umwandeln } } else { DeclareType(cl_F,y); @@ -135,7 +136,7 @@ const cl_C_R asinh (const cl_R& x, const cl_R& y) } if (eq(y,0)) { // y=0 - var cl_F xf = cl_float(x); // x in Float umwandeln + var cl_F xf = inline_cl_float(x); // x in Float umwandeln var cl_F& x = xf; // x Float if (zerop(x)) diff --git a/src/complex/transcendental/cl_C_atanh_aux.cc b/src/complex/transcendental/cl_C_atanh_aux.cc index 2435495..4c8af8d 100644 --- a/src/complex/transcendental/cl_C_atanh_aux.cc +++ b/src/complex/transcendental/cl_C_atanh_aux.cc @@ -14,14 +14,16 @@ #include "cl_F_tran.h" #include "cl_R.h" -#undef MAYBE_INLINE -#define MAYBE_INLINE inline +#define INLINE static inline +#define INLINE_DECL(fcn) inline_ ## fcn +#define REALLY_INLINE __attribute__((always_inline)) #include "cl_F_from_R_def.cc" namespace cln { // Hilfsfunktion für atanh und atan: u+iv := artanh(x+iy). Liefert cl_C_R(u,v). +const cl_C_R atanh (const cl_R& x, const cl_R& y) __attribute__((flatten)); const cl_C_R atanh (const cl_R& x, const cl_R& y) { // Methode: @@ -56,7 +58,7 @@ const cl_C_R atanh (const cl_R& x, const cl_R& y) // x=0 -> u=0, v=atan(X=1,Y=y) (Fall y=0 ist inbegriffen) return cl_C_R(0, atan(1,y)); if (eq(y,0)) { - var cl_F xf = cl_float(x); // (float x) + var cl_F xf = inline_cl_float(x); // (float x) var cl_F& x = xf; // x Float if (zerop(x)) @@ -92,7 +94,7 @@ const cl_C_R atanh (const cl_R& x, const cl_R& y) var cl_F yf; if (rationalp(x)) { DeclareType(cl_RA,x); - yf = cl_float(y); + yf = inline_cl_float(y); xf = cl_float(x,yf); } else { DeclareType(cl_F,x); diff --git a/src/float/dfloat/misc/cl_DF_signum.cc b/src/float/dfloat/misc/cl_DF_signum.cc index 3101a93..524ad8f 100644 --- a/src/float/dfloat/misc/cl_DF_signum.cc +++ b/src/float/dfloat/misc/cl_DF_signum.cc @@ -15,11 +15,16 @@ #define MAYBE_INLINE inline #include "cl_DF_minusp.cc" #include "cl_DF_zerop.cc" +#ifndef INLINE2 +#define INLINE2 +#define REALLY_INLINE2 +#define INLINE2_DECL(name) name +#endif namespace cln { -MAYBE_INLINE2 -const cl_DF signum (const cl_DF& x) +INLINE2 const cl_DF INLINE2_DECL(signum) (const cl_DF& x) REALLY_INLINE2; +INLINE2 const cl_DF INLINE2_DECL(signum) (const cl_DF& x) { if (minusp(x)) { return cl_DF_minus1; } // x<0 -> -1.0 elif (zerop(x)) { return cl_DF_0; } // x=0 -> 0.0 diff --git a/src/float/ffloat/misc/cl_FF_signum.cc b/src/float/ffloat/misc/cl_FF_signum.cc index 69cb60e..6816012 100644 --- a/src/float/ffloat/misc/cl_FF_signum.cc +++ b/src/float/ffloat/misc/cl_FF_signum.cc @@ -16,10 +16,16 @@ #include "cl_FF_minusp.cc" #include "cl_FF_zerop.cc" +#ifndef INLINE2 +#define INLINE2 +#define REALLY_INLINE2 +#define INLINE2_DECL(name) name +#endif + namespace cln { -MAYBE_INLINE2 -const cl_FF signum (const cl_FF& x) +INLINE2 const cl_FF INLINE2_DECL(signum) (const cl_FF& x) REALLY_INLINE2; +INLINE2 const cl_FF INLINE2_DECL(signum) (const cl_FF& x) { if (minusp(x)) { return cl_FF_minus1; } // x<0 -> -1.0 elif (zerop(x)) { return cl_FF_0; } // x=0 -> 0.0 diff --git a/src/float/lfloat/misc/cl_LF_signum.cc b/src/float/lfloat/misc/cl_LF_signum.cc index eae4705..a0d31b1 100644 --- a/src/float/lfloat/misc/cl_LF_signum.cc +++ b/src/float/lfloat/misc/cl_LF_signum.cc @@ -16,11 +16,16 @@ #define MAYBE_INLINE inline #include "cl_LF_minusp.cc" #include "cl_LF_zerop.cc" +#ifndef INLINE2 +#define INLINE2 +#define REALLY_INLINE2 +#define INLINE2_DECL(name) name +#endif namespace cln { -MAYBE_INLINE2 -const cl_LF signum (const cl_LF& x) +INLINE2 const cl_LF INLINE2_DECL(signum) (const cl_LF& x) REALLY_INLINE2; +INLINE2 const cl_LF INLINE2_DECL(signum) (const cl_LF& x) { if (zerop(x)) { return x; } // x=0 -> 0.0 else // je nach Vorzeichen von x diff --git a/src/float/misc/cl_F_signum.cc b/src/float/misc/cl_F_signum.cc index 0b51f9e..08ba0b6 100644 --- a/src/float/misc/cl_F_signum.cc +++ b/src/float/misc/cl_F_signum.cc @@ -11,8 +11,12 @@ #include "cl_F.h" -#undef MAYBE_INLINE2 -#define MAYBE_INLINE2 inline +#undef INLINE2 +#undef INLINE2_DECL +#undef REALLY_INLINE2 +#define INLINE2 static inline +#define INLINE2_DECL(name) inline_ ## name +#define REALLY_INLINE2 __attribute__((always_inline)) #include "cl_SF_signum.cc" #include "cl_FF_signum.cc" #include "cl_DF_signum.cc" @@ -23,10 +27,10 @@ namespace cln { const cl_F signum (const cl_F& x) { floatcase(x - , return signum(x); - , return signum(x); - , return signum(x); - , return signum(x); + , return inline_signum(x); + , return inline_signum(x); + , return inline_signum(x); + , return inline_signum(x); ); } diff --git a/src/float/sfloat/misc/cl_SF_signum.cc b/src/float/sfloat/misc/cl_SF_signum.cc index b1239da..1374727 100644 --- a/src/float/sfloat/misc/cl_SF_signum.cc +++ b/src/float/sfloat/misc/cl_SF_signum.cc @@ -15,11 +15,16 @@ #define MAYBE_INLINE inline #include "cl_SF_minusp.cc" #include "cl_SF_zerop.cc" +#ifndef INLINE2 +#define INLINE2 +#define REALLY_INLINE2 +#define INLINE2_DECL(name) name +#endif namespace cln { -MAYBE_INLINE2 -const cl_SF signum (const cl_SF& x) +INLINE2 const cl_SF INLINE2_DECL(signum) (const cl_SF& x) REALLY_INLINE2; +INLINE2 const cl_SF INLINE2_DECL(signum) (const cl_SF& x) { if (minusp(x)) { return SF_minus1; } // x<0 -> -1.0 elif (zerop(x)) { return SF_0; } // x=0 -> 0.0 diff --git a/src/integer/misc/cl_I_signum.cc b/src/integer/misc/cl_I_signum.cc index bbd236a..7a8a8c9 100644 --- a/src/integer/misc/cl_I_signum.cc +++ b/src/integer/misc/cl_I_signum.cc @@ -10,11 +10,16 @@ // Implementation. #include "cl_I.h" +#ifndef INLINE +#define INLINE +#define REALLY_INLINE +#define INLINE_DECL(name) name +#endif namespace cln { -MAYBE_INLINE -const cl_I signum (const cl_I& x) +INLINE const cl_I INLINE_DECL(signum) (const cl_I& x) REALLY_INLINE; +INLINE const cl_I INLINE_DECL(signum) (const cl_I& x) { if (minusp(x)) { return -1; } // x<0 -> -1 elif (zerop(x)) { return 0; } // x=0 -> 0 diff --git a/src/integer/ring/cl_I_ring.cc b/src/integer/ring/cl_I_ring.cc index 416738a..c827b34 100644 --- a/src/integer/ring/cl_I_ring.cc +++ b/src/integer/ring/cl_I_ring.cc @@ -13,7 +13,9 @@ CL_PROVIDE(cl_I_ring) #include "cln/integer.h" #include "cln/integer_io.h" +#define zerop inline_zerop #include "cl_I.h" +#undef zerop namespace cln { @@ -34,10 +36,11 @@ static const _cl_ring_element I_zero (cl_heap_ring* R) return _cl_ring_element(R, (cl_I)0); } +static bool I_zerop (cl_heap_ring* R, const _cl_ring_element& x) __attribute((flatten)); static bool I_zerop (cl_heap_ring* R, const _cl_ring_element& x) { unused R; - return zerop(The(cl_I)(x)); + return inline_zerop(The(cl_I)(x)); } static const _cl_ring_element I_plus (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y) diff --git a/src/rational/misc/cl_RA_signum.cc b/src/rational/misc/cl_RA_signum.cc index 40f5380..fc80077 100644 --- a/src/rational/misc/cl_RA_signum.cc +++ b/src/rational/misc/cl_RA_signum.cc @@ -11,11 +11,17 @@ #include "cl_RA.h" #include "cl_I.h" +#ifndef INLINE +#define INLINE +#define REALLY_INLINE +#define INLINE_DECL(name) name +#endif + namespace cln { -MAYBE_INLINE -const cl_RA signum (const cl_RA& x) +INLINE const cl_RA INLINE_DECL(signum) (const cl_RA& x) REALLY_INLINE; +INLINE const cl_RA INLINE_DECL(signum) (const cl_RA& x) { if (minusp(x)) { return -1; } // x<0 -> -1 elif (zerop(x)) { return 0; } // x=0 -> 0 diff --git a/src/rational/ring/cl_RA_ring.cc b/src/rational/ring/cl_RA_ring.cc index e7d33f3..eb47000 100644 --- a/src/rational/ring/cl_RA_ring.cc +++ b/src/rational/ring/cl_RA_ring.cc @@ -13,7 +13,9 @@ CL_PROVIDE(cl_RA_ring) #include "cln/rational.h" #include "cln/rational_io.h" +#define zerop inline_zerop #include "cl_RA.h" +#undef zerop namespace cln { @@ -34,10 +36,11 @@ static const _cl_ring_element RA_zero (cl_heap_ring* R) return _cl_ring_element(R, (cl_RA)0); } +static bool RA_zerop (cl_heap_ring* R, const _cl_ring_element& x) __attribute__((flatten)); static bool RA_zerop (cl_heap_ring* R, const _cl_ring_element& x) { unused R; - return zerop(The(cl_RA)(x)); + return inline_zerop(The(cl_RA)(x)); } static const _cl_ring_element RA_plus (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y) diff --git a/src/real/conv/cl_F_from_R_def.cc b/src/real/conv/cl_F_from_R_def.cc index 3c8e852..01d1082 100644 --- a/src/real/conv/cl_F_from_R_def.cc +++ b/src/real/conv/cl_F_from_R_def.cc @@ -10,11 +10,16 @@ // Implementation. #include "cl_R.h" +#ifndef INLINE +#define INLINE +#define INLINE_DECL(decl) decl +#define REALLY_INLINE +#endif namespace cln { -MAYBE_INLINE -const cl_F cl_float (const cl_R& x) +INLINE const cl_F INLINE_DECL(cl_float) (const cl_R& x) REALLY_INLINE; +INLINE const cl_F INLINE_DECL(cl_float) (const cl_R& x) { if (rationalp(x)) { DeclareType(cl_RA,x); diff --git a/src/real/misc/cl_R_signum.cc b/src/real/misc/cl_R_signum.cc index f151d6c..b225639 100644 --- a/src/real/misc/cl_R_signum.cc +++ b/src/real/misc/cl_R_signum.cc @@ -11,12 +11,20 @@ #include "cl_R.h" -#undef MAYBE_INLINE -#define MAYBE_INLINE inline +#undef INLINE +#undef REALLY_INLINE +#undef INLINE_DECL +#define INLINE static inline +#define REALLY_INLINE __attribute__((always_inline)) +#define INLINE_DECL(name) inline_ ## name #include "cl_I_signum.cc" #include "cl_RA_signum.cc" -#undef MAYBE_INLINE2 -#define MAYBE_INLINE2 inline +#undef INLINE2 +#undef INLINE2_DECL +#undef REALLY_INLINE2 +#define INLINE2 static inline +#define INLINE2_DECL(name) inline_ ## name +#define REALLY_INLINE2 __attribute__((always_inline)) #include "cl_SF_signum.cc" #include "cl_FF_signum.cc" #include "cl_DF_signum.cc" @@ -24,7 +32,8 @@ namespace cln { +const cl_R signum (const cl_R& x) __attribute__((flatten)); const cl_R signum (const cl_R& x) -GEN_R_OP1_7(x, signum, return) +GEN_R_OP1_7(x, inline_signum, return) } // namespace cln -- 1.5.3.7 Best regards, Alexei -- All science is either physics or stamp collecting.